1. 程式人生 > >我的stm32第一份程式碼--使用USART1進行資料轉發

我的stm32第一份程式碼--使用USART1進行資料轉發

程式碼如下。參考資料《零死角玩轉STM32F103–指南者》

#include"stm32f10x_gpio.h"
#include"stm32f10x_usart.h"



//USART1
#define DEBUG_USARTx                                    USART1
#define DEBUG_USART_CLK                             RCC_APB2Periph_USART1
#define DEBUG_USART_APBxClkCmd              RCC_APB2PeriphClockCmd
#define DEBUG_USART_BAUDRATE                    9600
//USART GPIO #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 #define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10 #define DEBUG_USART_IRQ USART1_IRQn #define DEBUG_USART_IRQHandler USART1_IRQHandler static void NVIC_Configuration(){ NVIC_InitTypeDef NVIC_InitStructure; //設定組 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //分配優先順序
NVIC_InitStructure.NVIC_IRQChannel=DEBUG_USART_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } void USART_Config(){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK,ENABLE); DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK,ENABLE); //TX 設定為推輓輸出 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(DEBUG_USART_TX_GPIO_PORT,&GPIO_InitStructure); //RX 設定為浮空輸入 GPIO_InitStructure.GPIO_Pin=DEBUG_USART_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(DEBUG_USART_RX_GPIO_PORT,&GPIO_InitStructure); //串列埠屬性配置程式碼 USART_InitStructure.USART_BaudRate=DEBUG_USART_BAUDRATE; //設定串列埠屬性 8 位資料 1個停止位 無校驗位 無硬體控制流 全雙工模式 USART_InitStructure.USART_WordLength=USART_WordLength_8b; USART_InitStructure.USART_StopBits=USART_StopBits_1; USART_InitStructure.USART_Parity=USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_Init(DEBUG_USARTx,&USART_InitStructure); NVIC_Configuration(); USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,ENABLE); USART_Cmd(DEBUG_USARTx,ENABLE); } void Usart_SendByte(USART_TypeDef* pUSARTx,uint8_t ch){ //向串列埠傳送一個位元組 USART_SendData(pUSARTx,ch); //等待發送完成 串列埠傳送標識被重置 while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)==RESET); } void Usart_SendString(USART_TypeDef* pUSARTx,char* str){ uint16_t index; for(index=0;*(str+index)!='\0';index++){ Usart_SendByte(pUSARTx,*(str+index)); } while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)==RESET); } void DEBUG_USART_IRQHandler(void){ uint8_t ucTemp; if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET){ //當檢查到串列埠的標誌位的接收中斷被設定的時候 從串列埠讀取資料 ucTemp=USART_ReceiveData(DEBUG_USARTx); //將收到的資料進行轉發 Usart_SendByte(DEBUG_USARTx,ucTemp); } } int main() { USART_Config(); Usart_SendString(DEBUG_USARTx,"This is a test program about TX-RX\n"); while(1){ } }

在程式碼執行的時候,最開始出現了不能進入UART1的接收中斷的情況,但是在後續的實驗中恢復了。希望大牛在此給予解答,不勝感激。

配置Keil5的時候使用了GPIO與USART。具體使用參照Keil5的提示。