我的stm32第一份程式碼--使用USART1進行資料轉發
阿新 • • 發佈:2019-01-02
程式碼如下。參考資料《零死角玩轉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的提示。