void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));//中斷執(zhí)行完成后繼續(xù)返回正常程序
void USART_Config(void)
{
? ?//PA9->TX PA10->RX
? ?GPIO_InitTypeDef GPIO_InitStructure={0};//定義IO口配置結(jié)構(gòu)體
? ?USART_InitTypeDef USART_InitStructure={0};//定義串口配置結(jié)構(gòu)體
? ?NVIC_InitTypeDef NVIC_InitStructure={0};//定義中斷配置結(jié)構(gòu)體
//UART4 APB1 GPIOC->APB2 TX->PC10 RX->PC11
? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//開GPIOA的時鐘
? ?GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//設(shè)置PA2為推挽復(fù)用輸出
? ?GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//設(shè)置引腳
? ?GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//設(shè)置傳播速度
? ?GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
? ?GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//設(shè)置PA3為浮空輸入
? ?GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//設(shè)置引腳
? ?GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
? ?USART_InitStructure.USART_BaudRate=9600;//設(shè)置波特率
? ?USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無硬件流
? ?USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//串口模式收發(fā)
? ?USART_InitStructure.USART_Parity=USART_Parity_No;//不使用校驗位
? ?USART_InitStructure.USART_StopBits=1;//1位的停止位
? ?USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字節(jié)長度
? ?USART_Init(USART1, &USART_InitStructure);//初始化USART2
? ?NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
? ?NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
? ?NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
? ?NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
? ?NVIC_Init(&NVIC_InitStructure);
? ?USART_Cmd(USART1,ENABLE);//使能串口2
? ?USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能中斷
}
//發(fā)送單個字符
void USARTx_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
{
? ? USART_SendData(pUSARTx, data);
? ? while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);//檢測寄存器是否有數(shù)據(jù)
}
//發(fā)送字符串
void USARTx_SendStr(USART_TypeDef* pUSARTx, char *str)
{
? ? uint8_t i = 0;
? ? do
? ? {
? ? ? ? USARTx_SendByte(pUSARTx, *(str+i));
? ? ? ?i++;
? ? }while(*(str+i) != '\0');
? ? while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET);//檢測是否傳輸完成
}
int fputc(int ch, FILE *f)
{
? ? USART_SendData(USART1,(uint8_t) ch);? //發(fā)送數(shù)據(jù)到串口
? ? while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
? ? return ch;
}
int fgetc(FILE *f)
{
? ? while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET);
? ? return(int)USART_ReceiveData(USART1);
}
void USART1_IRQHandler(void)
{
? ? uint8_t ucTemp;
? ? if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中斷產(chǎn)生
? ? {
? ? ? USART_ClearITPendingBit(USART1,USART_IT_RXNE);? ? //清除中斷標志
? ? ? ucTemp = USART_ReceiveData(USART1);? ? ? ? ? ? ? ?//接收數(shù)據(jù)
? ? ? USART_SendData(USART1, ucTemp);? ? ? ? ? ? ? ? ? ?//發(fā)送數(shù)據(jù)
? ? ?}
}
串口打印代碼如下