打印
[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】+ AVR64DD32UART通讯及按键中断模式测试

[复制链接]
1623|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hu9jj|  楼主 | 2022-11-15 12:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hu9jj 于 2022-11-15 12:41 编辑

#申请原创#

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


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


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


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


    这是回显的结果:


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

int main(void)
{
    SYSTEM_Initialize();
    USART0_Enable();
    printf("Hello World\r\n");

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

    TCA0_EnableInterrupt();
    Led0_SetHigh();
   
    while(1)
    {

        printf("wait=%d\r\n",wait);
        Led0_Toggle();
        DELAY_milliseconds(wait);
    }   
}

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





使用特权

评论回复
沙发
gaoyang9992006| | 2022-11-17 10:18 | 只看该作者
如果不关闭串口,没必要再在主函数中使能串口,因为MCC配置的初始化函数已经使能过了。

使用特权

评论回复
评论
hu9jj 2022-11-17 13:33 回复TA
谢谢指正! 我没有仔细看口初始化代码,所以在主程序开始时加上了这行代码。 
板凳
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幅截图中就有,可能看不太清楚,其实就是在接收了一个字节后立马将其发送,加了一行发送命令而已。补发代码如下:
void USART0_ReceiveISR(void)
{
    uint8_t regValue;
    uint8_t tempRxHead;
   
    usart0RxStatusBuffer[usart0RxHead].status = 0;

    if(USART0.RXDATAH & USART_FERR_bm)
    {
        usart0RxStatusBuffer[usart0RxHead].ferr = 1;
        if(NULL != USART0_FramingErrorHandler)
        {
            USART0_FramingErrorHandler();
        }
    }
    if(USART0.RXDATAH & USART_PERR_bm)
    {
        usart0RxLastError.perr = 1;
        if(NULL != USART0_ParityErrorHandler)
        {
            USART0_ParityErrorHandler();
        }  
    }
    if(USART0.RXDATAH & USART_BUFOVF_bm)
    {
        usart0RxStatusBuffer[usart0RxHead].oerr = 1;
        if(NULL != USART0_OverrunErrorHandler)
        {
            USART0_OverrunErrorHandler();
        }   
    }   
   
    regValue = USART0.RXDATAL;
   
    USART0_Write(regValue);                                 //发送接收到的数据
   
    tempRxHead = (usart0RxHead + 1) & USART0_RX_BUFFER_MASK;// Buffer size of RX should be in the 2^n
    if (tempRxHead == usart0RxTail) {
                // ERROR! Receive buffer overflow
        }
    else
    {
        // Store received data in buffer
                usart0RxBuffer[usart0RxHead] = regValue;
                usart0RxHead = tempRxHead;

                usart0RxCount++;
        }
    if (USART0_RxCompleteInterruptHandler != NULL)
    {
        (*USART0_RxCompleteInterruptHandler)();
    }
   
}

使用特权

评论回复
5
mxkw0514| | 2022-11-22 11:31 | 只看该作者
8位单片机感觉还是Atmel的用得比较顺

使用特权

评论回复
6
saservice| | 2022-12-1 17:48 | 只看该作者
串口的支持多大的波特率?              

使用特权

评论回复
7
sdCAD| | 2022-12-1 20:54 | 只看该作者
现在图形化开发就是趋势了。              

使用特权

评论回复
8
hu9jj|  楼主 | 2022-12-2 10:49 | 只看该作者
saservice 发表于 2022-12-1 17:48
串口的支持多大的波特率?

没有测试过其它的波特率,只测试过115200和9600的。

使用特权

评论回复
9
kkzz| | 2022-12-3 12:13 | 只看该作者
AVR64DD32UART有几个?

使用特权

评论回复
10
yorkbarney| | 2022-12-5 21:06 | 只看该作者
MCC配置代码简单多了。              

使用特权

评论回复
11
mnynt121| | 2023-1-12 12:16 | 只看该作者
这个中断支持几个模式?              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

151

主题

1059

帖子

11

粉丝