困扰多日的STM32F030串口中断接收问题解决了
[复制链接]
本帖最后由 bigbat 于 2021-8-9 11:33 编辑
最近想做一个STM32F030串口中断接收程序,但是前后好多天也没有弄好,期间出现了很多奇怪的问题,我也网上发了好多帖子也是没有成功,这个问题十分的变态,现在把这个问题写出来好让大家不要在掉坑里。
简单的说就是:LL_USART_TransmitData8这货在主循环中输出字符数组就会引起执行异常,要不输出乱码要不就死机。过程是这样的
uint8_t txChar;
while (1)
{
...
txChar =0x41;
LL_USART_TransmitData8(USART1, txChar);
while (!LL_USART_IsActiveFlag_TXE(USART1));
...
}
//程序原型
__STATIC_INLINE void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value)
{
USARTx->TDR = Value;
}
中断程序大概是这样的,中间改过好多次了。
__weak void USART_CharReception_Callback()
{
static uint16_t k=0;
ReceBuf[k] = LL_USART_ReceiveData8(USART1);
k =(k+1)%8;
}
/**
* @brief This function handles USART1 global interrupt.
*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(LL_USART_IsActiveFlag_RXNE(USART1) && LL_USART_IsEnabledIT_RXNE(USART1))
{
/* RXNE flag will be cleared by reading of DR register (done in call) */
/* Call function in charge of handling Character reception */
USART_CharReception_Callback();
}
if (LL_USART_IsActiveFlag_TXE(USART1)) {
LL_USART_ClearFlag_TC(USART1);
//serial->txbusy = 0;
}
/* USER CODE END USART1_IRQn 0 */
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
这段程序怎么样都是正常的,输出没有问题,接收也没啥事。但是如果在主程序中让LL_USART_TransmitData8输出数组就会出现问题。
#define SIZE 8
...
uint8_t RecBuf[SIZE];
uint8_t txChar;
while (1)
{
...
txChar = (uint8_t) RecBuf[len];
LL_USART_TransmitData8(USART1, txChar);
while (!LL_USART_IsActiveFlag_TXE(USART1));
...
}
不知道何故,我没有看到任何的违规操作。RecBuf是否初始化或赋值都不能正常工作。
但是如果把程序放到函数中就可以了。
while (1)
{
...
LL_USART_TransmitDatas(ReceBuf,8);
LL_GPIO_TogglePin(RS485RZ_GPIO_Port,RS485RZ_Pin);
LL_Delay(500);
...
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
...
void LL_USART_TransmitDatas(uint8_t *dataBuf,uint16_t len)
{
while(len--)
{
LL_USART_TransmitData8(USART1, *dataBuf++);
while (!LL_USART_IsActiveFlag_TXE(USART1));
}
}
该问题不知道是何原因造成的,能有高人给指点一二
|