板子用的是APM32F030R8 MINI Board给USART配置空闲中断,USART使能后就会进入一次空闲中断。
代码如下:
int main(void)
{
GPIO_Config_T gpioConfig;
USART_Config_T usartConfigStruct;
RCM_EnableAHBPeriphClock(MINI_COM1_RX_GPIO_CLK);
RCM_EnableAPB2PeriphClock(MINI_COM1_CLK);
// GPIO_ConfigPinAF(MINI_COM1_TX_GPIO_PORT, MINI_COM1_TX_SOURCE, MINI_COM1_TX_AF);
GPIO_ConfigPinAF(MINI_COM1_RX_GPIO_PORT, MINI_COM1_RX_SOURCE, MINI_COM1_RX_AF);
gpioConfig.mode = GPIO_MODE_AF;
// gpioConfig.pin = MINI_COM1_TX_PIN;
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.outtype = GPIO_OUT_TYPE_PP;
gpioConfig.pupd = GPIO_PUPD_PU;
// GPIO_Config(MINI_COM1_TX_GPIO_PORT, &gpioConfig);
gpioConfig.pin = MINI_COM1_RX_PIN;
GPIO_Config(MINI_COM1_RX_GPIO_PORT, &gpioConfig);
usartConfigStruct.baudRate = 110;
usartConfigStruct.mode = USART_MODE_RX;
usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
usartConfigStruct.parity = USART_PARITY_NONE;
usartConfigStruct.stopBits = USART_STOP_BIT_1;
usartConfigStruct.wordLength = USART_WORD_LEN_8B;
USART_Config(MINI_COM1, &usartConfigStruct);
NVIC_EnableIRQRequest(MINI_COM1_IRQn, 2);
USART_Enable(MINI_COM1);
// Delay(0xfff);
Delay(0xfffffff);
USART_EnableInterrupt(MINI_COM1, USART_INT_IDLEIE);
while (1)
{
}
}
CSDN上找到一篇是说USART使能发送功能会发送一个空闲帧,解决方法是使能串口,延迟一会再使能空闲中断。但那篇文章中用的是STM32,而且是自收发。我用APM32禁用USART发送功能再使能后还是会进入空闲中断。原因应该不是CSDN那篇文章里的,但用延迟确实能解决,就是延迟的时间要设置的很大。
CSDN文章链接:
https://blog.csdn.net/weixin_38106263/article/details/129234153?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171705336916800186593920%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171705336916800186593920&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-129234153-null-null.142^v100^pc_search_result_base3&utm_term=%E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD%E5%A4%9A%E8%BF%9B%E5%85%A5%E4%B8%80%E6%AC%A1&spm=1018.2226.3001.4187
还有一个问题是不同程序,延迟时间要设的得不一样;同一个程序,波特率设置得不一样,延迟时间也要不一样。
写的串口+DMA缓存收发程序里的代码:
void USART_Init(USART_ConfigType *usartType,USART_Config_T* usartConfig) {
usartType->gpioInit(&(usartType->gpioType));
// 启用USART时钟
usartType->rcmEnableAPB(usartType->usartClock);
// 配置USART
USART_Config(usartType->usart, usartConfig);
// 启用USART中断
NVIC_EnableIRQRequest(usartType->irqChannel, usartType->irqPriority);
USART_EnableInterrupt(usartType->usart,USART_INT_ERRIE);
USART_Enable(usartType->usart);
// 延迟和清除状态标志
Delay(0xfffff);
USART_ClearStatusFlag(usartType->usart, USART_INT_IDLEIE);
USART_EnableInterrupt(usartType->usart, USART_INT_IDLEIE);
if (usartType->enableDMA){
DMA_Init(usartType);
USART_EnableDMA(usartType->usart, USART_DMA_REQUEST_RX);
USART_EnableDMA(usartType->usart, USART_DMA_REQUEST_TX);
}
}
同样是115200的波特率,这里delay(0xfff)就行了,而同样程序,波特率改为1200后,这里的延时又要改为delay(0xfffff)
我想知道串口使能后进入空闲中断的原因,还有有没有除了延时外其他的方法解决这个问题。 |