新手求助CH32V307串口無法進(jìn)入空閑中斷

我這里用的是CH32V307,寫一個(gè)modbus從機(jī),需要配合空閑中斷判斷數(shù)據(jù)幀有咩有結(jié)束,外部是通過458通信的,有幾點(diǎn)疑問請(qǐng)大家?guī)兔纯垂?/p>

1,發(fā)現(xiàn)無法進(jìn)入空閑中斷,只進(jìn)入到了接受中斷,

2,我看官方evk的代碼示例都沒有在中斷里面清除標(biāo)志,清除標(biāo)志用USART_ClearFlag還是USART_ClearITPendingBit?

3,usart和uart都支持dma嗎?

下面貼我的代碼大家?guī)兔纯础?/p>


初始化:

void rs485_init(void)

{

? ? GPIO_InitTypeDef? GPIO_InitStructure = {0};

? ? USART_InitTypeDef USART_InitStructure = {0};


? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART8, ENABLE);

? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);



? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

? ? GPIO_Init(GPIOB, &GPIO_InitStructure);

? ? RS485_READ_EN(true);


? ? /* UART8 TX-->C.4? RX-->C.5 */

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_Init(GPIOC, &GPIO_InitStructure);

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

? ? GPIO_Init(GPIOC, &GPIO_InitStructure);


? ? USART_InitStructure.USART_BaudRate = 9600;

? ? 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_Tx | USART_Mode_Rx;


? ? USART_Init(UART8, &USART_InitStructure);


? ? NVIC_InitTypeDef NVIC_InitStructure;

? ? NVIC_InitStructure.NVIC_IRQChannel = UART8_IRQn;

? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

? ? NVIC_Init(&NVIC_InitStructure);


? ? USART_ITConfig(UART8, USART_IT_RXNE | USART_IT_IDLE, ENABLE);

? ? USART_Cmd(UART8, ENABLE);//先使能串口 再使能中斷

}


中斷:

void UART8_IRQHandler(void)

{

? ? uint8_t revice = 0;

? ? if (USART_GetITStatus(UART8, USART_IT_IDLE) == SET)

? ? {

? ? ? ? USART_ClearFlag(UART8, USART_IT_IDLE);

? ? ? ? revice = UART8->STATR;

? ? ? ? revice = UART8->DATAR;

? ? ? ? printf("rs485_msg.rx_len: %d\r\n", rs485_msg.rx_len);

? ? ? ? printf_hex(rs485_msg.rx_buffer, rs485_msg.rx_len);

? ? }

? ? if (USART_GetITStatus(UART8, USART_IT_RXNE) == SET)

? ? {

? ? ? ? USART_ClearITPendingBit(UART8, USART_IT_RXNE);

? ? ? ? revice =? USART_ReceiveData(UART8);

? ? ? ? rs485_msg.rx_buffer[rs485_msg.rx_len++] = revice;

? ? ? ? printf("%02x",revice);


? ? }

}


您好,關(guān)于你的問題:

1、中斷函數(shù)注意要加中斷聲明,如下圖1;

2、中斷標(biāo)志位的清除要調(diào)用USART_ClearITPendingBit函數(shù),如下圖1;注意空閑中斷標(biāo)志位的清除是先讀取STATR,再讀取DATAR;

3、USART和UART是都支持DMA的。

后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通。

image.png

圖1


已經(jīng)知道啥問題了,

? ? USART_ITConfig(UART8, USART_IT_IDLE, ENABLE);

? ? USART_ITConfig(UART8, USART_IT_RXNE?, ENABLE);

在使能中斷的時(shí)候要分開寫,一起的話

? ? USART_ITConfig(UART8, USART_IT_RXNE | USART_IT_IDLE, ENABLE);

這樣就觸發(fā)不了空閑,很奇怪。



您好,對(duì)串口中斷使能時(shí)是需要分開寫的,具體可以看一下該函數(shù)里面的操作,都是對(duì)具體某一位進(jìn)行配置的。若需要一起使能,可以使用寄存器操作方式。


嗯呢,謝謝了,知道了,可否發(fā)一份uart的dma收發(fā)的例子出來參考下呢。


您好,在CH32V307 EVT中有串口DMA收發(fā)的例程,你可以參考一下,EVT下載鏈接如下:

http://www.findthetime.net/downloads/CH32V307EVT_ZIP.html

?


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

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