UART中断方式发送无反应

纠结了好些天了,终于解决了。

泪奔啊!!刚刚写了一堆。。结果undo一下,全没了。。redo也不管用。。。抓狂


程序内容:UART中断方式的接收与发送


问题描述:可以中断方式接收,但是从来没有进去过0x2发送中断


分析:因为U0IIR每次读取都会清空中断标志,而我的程序在中断服务函数里读取了两次U0IIR,第一次读取U0IIR判断是否有中断,第二遍读取U0IIR判断是什么类型的中断。所以清空了发送中断标志,不会进入中断。。不过很奇怪为什么缺能正常接收。。


解决方法:注释掉第一遍对U0IIR的读取。。但是不知道这样子会不会不严谨,至少程序可以跑起来了。

另外,从网上看到,有时候会发生发送中断不断触发的情况,需要在初始化时只允许接收中断。然后在接收到数据后再使能发送中断。。发送完毕后再关闭发送中断。用这种方法实现接收->发送。

中断函数如下:

__irq void irq_handler(void)
{
  int iir = U0IIR;
    switch(iir & 0XF)
    {
    case 0x2://发送中断
      U0THR = transmit;
      U0IER = 0X1;
      break;
    case 0xc://字符超时中断
      break;
    case 0x4://
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是STM32 HAL库UART中断形式发送的示例代码: ``` #include "stm32f4xx_hal.h" /* UART_HandleTypeDef结构体定义 */ UART_HandleTypeDef huart2; /* 用于存储UART接收数据的缓冲区 */ uint8_t rxBuffer[10]; /* 定义要发送的数据 */ uint8_t txData[] = "Hello, world!\r\n"; int main(void) { /* 初始化HAL库 */ HAL_Init(); /* 初始化UART2 */ __HAL_RCC_USART2_CLK_ENABLE(); huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart2); /* 开启UART2接收中断 */ HAL_UART_Receive_IT(&huart2, rxBuffer, 10); while (1) { /* 发送数据 */ HAL_UART_Transmit_IT(&huart2, txData, sizeof(txData)); /* 等待发送完成 */ while (huart2.gState != HAL_UART_STATE_READY) {} /* 延时 */ HAL_Delay(1000); } } /* UART接收中断处理函数 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* 处理接收到的数据 */ /* ... */ /* 继续开启接收中断 */ HAL_UART_Receive_IT(&huart2, rxBuffer, 10); } /* UART发送中断处理函数 */ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { /* 发送完成 */ } ``` 在上述代码中,使用`HAL_UART_Init`函数初始化UART2,然后使用`HAL_UART_Receive_IT`函数开启UART2接收中断,并指定接收缓冲区和缓冲区长度。 在主循环中,使用`HAL_UART_Transmit_IT`函数发送数据,并在发送完成后等待,直到UART处于就绪状态。 当接收到数据时,将调用`HAL_UART_RxCpltCallback`函数,以处理接收到的数据,并使用`HAL_UART_Receive_IT`函数继续开启接收中断。 当发送完成时,将调用`HAL_UART_TxCpltCallback`函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值