項(xiàng)目需求:
通過PC串口或其他并聯(lián)板的串口,發(fā)送一個(gè)指令(如1,2,3,4等)到CH32V203RBT6芯片的串口2中,芯片的串口2接收到之后,簡(jiǎn)單處理,如發(fā)送的是1,那么返回A,如發(fā)送的是2,返回B
我的設(shè)計(jì)思路:
初始化串口2,并啟動(dòng)接收中斷,當(dāng)接收到串口2數(shù)據(jù),進(jìn)行判斷,是1,馬上串口2發(fā)回字符A
問題:
沒有進(jìn)入中斷接收
代碼
#include "usart.h"
//保證中斷之后程序的正常運(yùn)行,不添加情況下,中斷前數(shù)據(jù)不會(huì)被返回
void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void USART2_CFG(uint32_t baudrate) {
? ? GPIO_InitTypeDef GPIO_InitStructure; // GPIO結(jié)構(gòu)體
? ? USART_InitTypeDef USATRT_InitStructure; // 串口結(jié)構(gòu)體
? ? NVIC_InitTypeDef NVIC_InitStructure; // 中斷函數(shù)結(jié)構(gòu)體
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 加載串口2時(shí)鐘
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 加載串口1的GPIOA時(shí)鐘
? ? USART_DeInit(USART2); // 串口初始化聲明
? ? // 設(shè)置PA2,PA3的兩個(gè)引腳
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2端口 TX
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Speed_50MHz; // 選擇速度
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 推挽模式
? ? GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化PA2
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3端口 RX
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空模式
? ? GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化PA3
? ? USATRT_InitStructure.USART_BaudRate = baudrate; // 設(shè)置串口波特率
? ? USATRT_InitStructure.USART_WordLength = USART_WordLength_8b; // 字節(jié)長(zhǎng)度
? ? USATRT_InitStructure.USART_StopBits = USART_StopBits_1; // 設(shè)置停止位 1
? ? USATRT_InitStructure.USART_Parity = USART_Parity_No; // 奇偶校驗(yàn) 不使用奇偶校驗(yàn)
? ? USATRT_InitStructure.USART_HardwareFlowControl =
? ? USART_HardwareFlowControl_None; // 硬件流控制:無
? ? USATRT_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //輸入輸出模式 TX|RX
? ? USART_Init(USART2, &USATRT_InitStructure); // 初始化串口2
? ? USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // 啟動(dòng)中斷
? ? NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; // 中斷函數(shù) 串口2
? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 搶占優(yōu)先級(jí) 1
? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子優(yōu)先級(jí)默認(rèn)為 0
? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IR通道啟用
? ? NVIC_Init(&NVIC_InitStructure); // 中斷優(yōu)先級(jí)初始化
? ? USART_Cmd(USART2, ENABLE); // 啟動(dòng)串口2
} // 初始化串口函數(shù)
void USARTx_SendByte(USART_TypeDef* pUSARTx, uint8_t data) {
? ? USART_SendData(pUSARTx, data); // 發(fā)送字符函數(shù)
? ? while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE)==RESET);
} // 發(fā)送單個(gè)字符
void USARTx_SendStr(USART_TypeDef* pUSARTx, char *str) {
? ? uint8_t i = 0;
? ? do {
? ? ? ? // 利用循環(huán)把字符串逐個(gè)字節(jié)發(fā)送出去,直至字符串為空
? ? ? ? USARTx_SendByte(pUSARTx, *(str + i));
? ? ? ? i++;
? ? } while (*(str + i) != '\0');
? ? while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);
} // 串口發(fā)送字符串函數(shù)
void USART2_IRQHandler(void) {
//? ? uint8_t ucTemp;
? ? if (USART_GetFlagStatus(USART2, USART_IT_RXNE) != RESET) {
? ? ? ? USART_ClearFlag(USART2, USART_IT_RXNE); // 清除中斷寄存器標(biāo)志
//? ? ? ? ucTemp = USART_ReceiveData(USART2); // 接收串口2數(shù)據(jù)
//? ? ? ? ZM1=ucTemp;
? ? ? ? USARTx_SendStr(USART2, "vca\n"); // 輸出字符串
? ? }
} // 串口2的中斷函數(shù)
WCH-LINK線還在運(yùn)輸?shù)穆飞?現(xiàn)在是USB直接下載的所以無法進(jìn)行調(diào)試,新手小白剛接觸,煩請(qǐng)大佬有空幫忙解答一下