[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】+ AVR64DD32UART通讯及按键中断模式测试

[复制链接]
2051|11
 楼主| hu9jj 发表于 2022-11-15 12:37 | 显示全部楼层 |阅读模式
本帖最后由 hu9jj 于 2022-11-15 12:41 编辑

#申请原创#

    一、UART通讯测试
    进入MCC,添加UART设备,同时设置好Redirect Printf to UART和Interrupt Driven,前者方便在代码中使用printf命令发送数据,后者则是方便使用中断来接收数据:


    同时还需要在中断管理中开启中断:


    这样就可以在程序中使用printf命令来发送数据了:


    在串口接收中断里找到读取数据的代码,并在其后添加一行发送的代码,将接收到的数据原封不动地写回,就可以实现回显数据了:


    这是回显的结果:


二、按键中断模式测试
    在主函数中首先开启按键中断的触发模式,这里选择下降沿触发,然后指定按键中断处理的函数名:

  1. int main(void)
  2. {
  3.     SYSTEM_Initialize();
  4.     USART0_Enable();
  5.     printf("Hello World\r\n");

  6.     SW0_SetDigitalInput();
  7.     SW0_SetPullUp();
  8.     SW0_EnableInterruptForFallingEdge();         //设置引脚的中断模式
  9.     PF6_SetInterruptHandler(SW0_Handler);        //指定中断处理的函数

  10.     TCA0_EnableInterrupt();
  11.     Led0_SetHigh();
  12.    
  13.     while(1)
  14.     {

  15.         printf("wait=%d\r\n",wait);
  16.         Led0_Toggle();
  17.         DELAY_milliseconds(wait);
  18.     }   
  19. }

    这是按键中断处理函数,消抖之后对wait变量进行左移一位操作,超过1600之后恢复为初始值100:
  1. void SW0_Handler(void)
  2. {
  3.     if(0==SW0_GetValue()){
  4.         DELAY_milliseconds(50);
  5.         if(0==SW0_GetValue()){
  6.             wait <<= 1;
  7.             if(wait>1600)
  8.                 wait = 100;
  9.         }
  10.     }
  11. }





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
gaoyang9992006 发表于 2022-11-17 10:18 | 显示全部楼层
如果不关闭串口,没必要再在主函数中使能串口,因为MCC配置的初始化函数已经使能过了。

评论

谢谢指正! 我没有仔细看口初始化代码,所以在主程序开始时加上了这行代码。  发表于 2022-11-17 13:33
zhuotuzi 发表于 2022-11-17 10:20 | 显示全部楼层
上图说串口设置中断接收,没看到有串口中断接收的程序啊。楼主可以演示一下吗
 楼主| hu9jj 发表于 2022-11-17 13:35 | 显示全部楼层
本帖最后由 hu9jj 于 2022-11-17 13:37 编辑
zhuotuzi 发表于 2022-11-17 10:20
上图说串口设置中断接收,没看到有串口中断接收的程序啊。楼主可以演示一下吗 ...

在一楼的第4幅截图中就有,可能看不太清楚,其实就是在接收了一个字节后立马将其发送,加了一行发送命令而已。补发代码如下:
  1. void USART0_ReceiveISR(void)
  2. {
  3.     uint8_t regValue;
  4.     uint8_t tempRxHead;
  5.    
  6.     usart0RxStatusBuffer[usart0RxHead].status = 0;

  7.     if(USART0.RXDATAH & USART_FERR_bm)
  8.     {
  9.         usart0RxStatusBuffer[usart0RxHead].ferr = 1;
  10.         if(NULL != USART0_FramingErrorHandler)
  11.         {
  12.             USART0_FramingErrorHandler();
  13.         }
  14.     }
  15.     if(USART0.RXDATAH & USART_PERR_bm)
  16.     {
  17.         usart0RxLastError.perr = 1;
  18.         if(NULL != USART0_ParityErrorHandler)
  19.         {
  20.             USART0_ParityErrorHandler();
  21.         }  
  22.     }
  23.     if(USART0.RXDATAH & USART_BUFOVF_bm)
  24.     {
  25.         usart0RxStatusBuffer[usart0RxHead].oerr = 1;
  26.         if(NULL != USART0_OverrunErrorHandler)
  27.         {
  28.             USART0_OverrunErrorHandler();
  29.         }   
  30.     }   
  31.    
  32.     regValue = USART0.RXDATAL;
  33.    
  34.     USART0_Write(regValue);                                 //发送接收到的数据
  35.    
  36.     tempRxHead = (usart0RxHead + 1) & USART0_RX_BUFFER_MASK;// Buffer size of RX should be in the 2^n
  37.     if (tempRxHead == usart0RxTail) {
  38.                 // ERROR! Receive buffer overflow
  39.         }
  40.     else
  41.     {
  42.         // Store received data in buffer
  43.                 usart0RxBuffer[usart0RxHead] = regValue;
  44.                 usart0RxHead = tempRxHead;

  45.                 usart0RxCount++;
  46.         }
  47.     if (USART0_RxCompleteInterruptHandler != NULL)
  48.     {
  49.         (*USART0_RxCompleteInterruptHandler)();
  50.     }
  51.    
  52. }
mxkw0514 发表于 2022-11-22 11:31 | 显示全部楼层
8位单片机感觉还是Atmel的用得比较顺
saservice 发表于 2022-12-1 17:48 | 显示全部楼层
串口的支持多大的波特率?              
sdCAD 发表于 2022-12-1 20:54 | 显示全部楼层
现在图形化开发就是趋势了。              
 楼主| hu9jj 发表于 2022-12-2 10:49 | 显示全部楼层
saservice 发表于 2022-12-1 17:48
串口的支持多大的波特率?

没有测试过其它的波特率,只测试过115200和9600的。
kkzz 发表于 2022-12-3 12:13 | 显示全部楼层
AVR64DD32UART有几个?
yorkbarney 发表于 2022-12-5 21:06 | 显示全部楼层
MCC配置代码简单多了。              
mnynt121 发表于 2023-1-12 12:16 | 显示全部楼层
这个中断支持几个模式?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:Microchip
简介:让我们来为您提供帮助。我们可提供各种资源来帮助您解决一切问题。是否需要与我们的客户支持团队联系?您可以通过电话、在线聊天功能或电子邮件与他们联系。

151

主题

1063

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部