当前位置:   article > 正文

NRF52840学习历程(三)串口中断_app_uart_tx_empty

app_uart_tx_empty

时间在2021126,寒假放假在家好好学一学

 

开发板:初雪的100出头那块 NRF52840 EVAL KIT

下载工具:JINLK V11(最好是JLINK V9以上 也有人用JLINK OB也行,其他的下载器STLINK,DAP不建议用)

版本号: KEIL5编程环境,CMSIS为5.3.0, NRF52840的CMSIS为8.35.0

参考资料: NRF52840-Eval-Kit-Schematic.pdf(原理图)

nRF5_SDK_17.0.2_d674dde(官方例程)

nRF5_SDK_17.0.0_offline_doc(官方文档)

 

实现功能: 串口通信中断 一般是用EasyDMA来搬运数据,搬运完成后触发中断

 

先开启UARTE功能

 

初始化代码基本保持不变

  1. const app_uart_comm_params_t comm_params =
  2. {
  3. 8,
  4. 6,
  5. 0,
  6. 0,
  7. APP_UART_FLOW_CONTROL_DISABLED,
  8. false,
  9. NRF_UART_BAUDRATE_115200
  10. };

变的是写入寄存器的时候, 赋予一个处理中断的函数,上一节是错误处理中断函数

  1. uint32_t err_code;
  2. APP_UART_FIFO_INIT(&comm_params,
  3. UART_RX_BUF_SIZE,
  4. UART_TX_BUF_SIZE,
  5. uart_interrupt,
  6. APP_IRQ_PRIORITY_LOWEST,
  7. err_code);

于是重点就放在了中断函数的编写上面来

串口中断产生的事件如上图, 1)接收到串口数据 2)FIFO模块出现传输问题 3)通信错误 4)发送空 5)在不用FIFO缓存时作为串口, 那么数据就放在第五个里面读取

 

代码如下

  1. void uart_interrupt(app_uart_evt_t * p_event)
  2. {
  3. uint8_t dat;
  4. if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
  5. {
  6. APP_ERROR_HANDLER(p_event->data.error_communication);
  7. }
  8. else if (p_event->evt_type == APP_UART_FIFO_ERROR)
  9. {
  10. APP_ERROR_HANDLER(p_event->data.error_code);
  11. }
  12. else if (p_event->evt_type == APP_UART_DATA_READY)
  13. {//数据已到达串口 , 可以读数据了
  14. app_uart_get(&dat); //读取数据
  15. app_uart_put(dat); // 原路发回
  16. }
  17. else if (p_event->evt_type == APP_UART_TX_EMPTY)
  18. {//发送完成
  19. //发送完成不知道要做什么的,可以点个灯提醒
  20. nrf_gpio_pin_toggle(LED0);
  21. }
  22. }

可以看到 每次发送数据时 LED0灯翻转, 然后串口助手回显

 

完整代码如下:

  1. #include <stdbool.h>
  2. #include <stdint.h>
  3. #include "nrf_delay.h"
  4. #include "nrf_gpio.h"
  5. #include "nrf_drv_gpiote.h"
  6. #include "nrf_uart.h"
  7. #include "app_uart.h"
  8. uint32_t LED0,LED1,LED2,LED3;
  9. uint32_t KEY0,KEY1,KEY2,KEY3;
  10. void KEY_Interrupt(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action);
  11. #define MAX_TEST_DATA_BYTES (15U) /**< max number of test bytes to be used for tx and rx. */
  12. #define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */
  13. #define UART_RX_BUF_SIZE 256 /**< UART RX buffer size. */
  14. void uart_interrupt(app_uart_evt_t * p_event);
  15. /**
  16. * @brief Function for application main entry.
  17. */
  18. int main(void)
  19. {
  20. nrf_drv_gpiote_in_config_t key_ex_config; //按键中断配置用
  21. LED0 = NRF_GPIO_PIN_MAP(0,13);
  22. LED1 = NRF_GPIO_PIN_MAP(0,14);
  23. LED2 = NRF_GPIO_PIN_MAP(1,9);
  24. LED3 = NRF_GPIO_PIN_MAP(0,16);
  25. KEY0 = NRF_GPIO_PIN_MAP(0,11);
  26. KEY1 = NRF_GPIO_PIN_MAP(0,24);
  27. KEY2 = NRF_GPIO_PIN_MAP(0,20);
  28. KEY3 = NRF_GPIO_PIN_MAP(0,17);
  29. nrf_gpio_cfg_output(LED0);
  30. nrf_gpio_cfg_output(LED1);
  31. nrf_gpio_cfg_output(LED2);
  32. nrf_gpio_cfg_output(LED3);
  33. nrf_gpio_pin_set(LED0);
  34. nrf_gpio_pin_set(LED1);
  35. nrf_gpio_pin_set(LED2);
  36. nrf_gpio_pin_set(LED3);
  37. nrf_gpio_cfg_input(KEY0,NRF_GPIO_PIN_PULLUP );
  38. nrf_gpio_cfg_input(KEY1,NRF_GPIO_PIN_PULLUP );
  39. nrf_gpio_cfg_input(KEY2,NRF_GPIO_PIN_PULLUP );
  40. nrf_gpio_cfg_input(KEY3,NRF_GPIO_PIN_PULLUP );
  41. nrf_drv_gpiote_init();//启动GPIOTE时钟,可以这么说
  42. key_ex_config.hi_accuracy=false; // 启用低精确度PORT事件
  43. key_ex_config.pull = NRF_GPIO_PIN_PULLUP ; //上啦
  44. key_ex_config.sense = NRF_GPIOTE_POLARITY_HITOLO ;//下降沿
  45. nrf_drv_gpiote_in_init(KEY0, &key_ex_config, KEY_Interrupt);
  46. nrf_drv_gpiote_in_init(KEY1, &key_ex_config, KEY_Interrupt);
  47. nrf_drv_gpiote_in_init(KEY2, &key_ex_config, KEY_Interrupt);
  48. nrf_drv_gpiote_in_init(KEY3, &key_ex_config, KEY_Interrupt);
  49. nrf_drv_gpiote_in_event_enable(KEY0, true);//启动KEY0中断
  50. nrf_drv_gpiote_in_event_enable(KEY1, true);//启动KEY1中断
  51. nrf_drv_gpiote_in_event_enable(KEY2, true);//启动KEY2中断
  52. nrf_drv_gpiote_in_event_enable(KEY3, true);//启动KEY3中断
  53. const app_uart_comm_params_t comm_params =
  54. {
  55. 8,
  56. 6,
  57. 0,
  58. 0,
  59. APP_UART_FLOW_CONTROL_DISABLED,
  60. false,
  61. NRF_UART_BAUDRATE_115200
  62. };
  63. uint32_t err_code;
  64. APP_UART_FIFO_INIT(&comm_params,
  65. UART_RX_BUF_SIZE,
  66. UART_TX_BUF_SIZE,
  67. uart_interrupt,
  68. APP_IRQ_PRIORITY_LOWEST,
  69. err_code);
  70. uint8_t str[]="hello world!\r\n";
  71. uint8_t i=0,str1[20];
  72. while(1)
  73. {
  74. // printf("hello world! \r\n");
  75. // while(str[i]!='\0')
  76. // {
  77. // app_uart_put(str[i]);
  78. // i++;
  79. // }
  80. // nrf_delay_ms(1000);
  81. // i=0;
  82. if( NRF_SUCCESS == app_uart_get(str1))
  83. printf("%s\r\n",str1);
  84. }
  85. }
  86. void KEY_Interrupt(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
  87. {
  88. if(KEY0 == pin)
  89. nrf_gpio_pin_toggle(LED0);
  90. if(KEY1 == pin)
  91. nrf_gpio_pin_toggle(LED1);
  92. if(KEY2 == pin)
  93. nrf_gpio_pin_toggle(LED2);
  94. if(KEY3 == pin)
  95. nrf_gpio_pin_toggle(LED3);
  96. }
  97. void uart_interrupt(app_uart_evt_t * p_event)
  98. {
  99. uint8_t dat;
  100. if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
  101. {
  102. APP_ERROR_HANDLER(p_event->data.error_communication);
  103. }
  104. else if (p_event->evt_type == APP_UART_FIFO_ERROR)
  105. {
  106. APP_ERROR_HANDLER(p_event->data.error_code);
  107. }
  108. else if (p_event->evt_type == APP_UART_DATA_READY)
  109. {//数据已到达串口 , 可以读数据了
  110. app_uart_get(&dat); //读取数据
  111. app_uart_put(dat); // 原路发回
  112. }
  113. else if (p_event->evt_type == APP_UART_TX_EMPTY)
  114. {//发送完成
  115. //发送完成不知道要做什么的,可以点个灯提醒
  116. nrf_gpio_pin_toggle(LED0);
  117. }
  118. }

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  

闽ICP备14008679号