[PIC®/AVR® MCU]

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

[复制链接]
605|5
手机看帖
扫描二维码
随时随地手机跟帖
hu9jj|  楼主 | 2022-11-15 12:37 | 显示全部楼层 |阅读模式
本帖最后由 hu9jj 于 2022-11-15 12:41 编辑

#申请原创#

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

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

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

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

    这是回显的结果:
MCC_19.jpg

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

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)();
    }
   
}

使用特权

评论回复
mxkw0514| | 2022-11-22 11:31 | 显示全部楼层
8位单片机感觉还是Atmel的用得比较顺

使用特权

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

本版积分规则