新手剛接觸,遇到無法中斷,請(qǐng)求大佬指教,使用芯片型號(hào)是CH32V203RBT6

項(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)大佬有空幫忙解答一下

中斷中發(fā)送也需要判斷標(biāo)志位的

? ? while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE)==RESET);


感謝你回復(fù),我是在中斷中,調(diào)用發(fā)送的函數(shù),USARTx_SendStr 這個(gè)函數(shù)里面已經(jīng)有判斷標(biāo)志位,請(qǐng)問這樣寫是否有問題?


您好,附件例程是根據(jù)你設(shè)計(jì)思路寫的參考例程,發(fā)1回A,如下圖,你可以參考一下

icon_rar.gifCH32V203 USART2接收中斷.zip

image.png

image.png


非常感謝,馬上測(cè)試


拿到了代碼,原文沒改,但還是不行

芯片啟動(dòng)的時(shí)候輸出是正確的,證明串口和程序都啟動(dòng)和寫入正確了,但發(fā)送過去,返回的還是1不是A

我截圖我的燒錄工具選擇項(xiàng)目截圖和測(cè)試串口截圖,是什么原因就是不行呢?可以從哪些地方去檢查?求解


1710302417110695.png

1710302417169453.png




您好,你直接使用我例程做測(cè)試,不要做任何修改,工程已根據(jù)你的型號(hào)進(jìn)行了配置,下載時(shí)FLASH、RAM的大小選擇160+32,如下圖。

icon_rar.gifCH32V203 USART2接收中斷.zip

image.png


收到,馬上測(cè)試


我是用USB直連下載程序的,配置按你說的配置了32+160,并且沒有修改任何東西直接運(yùn)行,效果還是一樣,以下是截圖,看下

下載設(shè)置.png2.png


你好,我這邊測(cè)試也是符合預(yù)期的,請(qǐng)您留個(gè)微信我加你具體看一下你的工程image.png


另外問一下,我的芯片型號(hào)是CH32V203RBT6 和 C8T6一樣的是不?


發(fā)您的工程已經(jīng)改成RBT6了,只是工程名字沒改,要是還沒有解決,請(qǐng)您留個(gè)微信,我這邊遠(yuǎn)程給你看下。


已私信你了,還沒解決,摸不著頭腦不知哪里出現(xiàn)問題了,感謝


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频