zoukankan      html  css  js  c++  java
  • 2-4-HC32F460(华大)+BC260Y(NB-IOT)基本控制篇(自建物联网平台)-基础外设例程-串口(基本使用)

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTA_BC260Y/my.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

    说明

    HC32F460基础例程源码下载链接: https://github.com/yangfengwu45/learnHC32F460.git

    基础外设例程是提供给已经开发过M0或M1或M3或M4等ARM内核单片机的开发人员!

    例程精简扼要, 力求让开发人员快速使用华大单片机做项目!

    这节说一下串口.

    先提示一个事情

    1.打开数据手册

    2.第33页(我以自己使用的HC32F460JETA为例)

    主要说一下后面的 Func_Grp

    3.然后找到38页

    4.列如:PC0

    PC0后面写的是 Func_Grp1

    那么这个引脚可以作为这些功能使用

     

    5.单片机的USART ,SPI, I2C, I2S, 不是固定的引脚,自己根据表格去指定

    6.华大给了好几个串口的例子

    基本使用

    1.串口基本的初始化

    usart.c

    #define USART_C_
    
    #include "usart.h"
    
    
    /*******************************************************************************
     ** rief USART RX irq callback function.//串口接收中断函数
     ** param [in] None
     ** 
    etval None
     ******************************************************************************/
    static void Usart1RxIrqCallback(void)
    {
        uint16_t m_u16RxData;
        m_u16RxData = USART_RecData(M4_USART1);//获取串口接收的数据
    }
    
    /*******************************************************************************
     ** rief USART RX error irq callback function.(串口接收错误中断处理函数)
     ** param [in] None
     ** 
    etval None
     ******************************************************************************/
    static void Usart1ErrIrqCallback(void)
    {
        if (Set == USART_GetStatus(M4_USART1, UsartFrameErr)){ USART_ClearStatus(M4_USART1, UsartFrameErr);}
        else{}
    
        if (Set == USART_GetStatus(M4_USART1, UsartParityErr)) {USART_ClearStatus(M4_USART1, UsartParityErr);}
        else{}
    
        if (Set == USART_GetStatus(M4_USART1, UsartOverrunErr)) {USART_ClearStatus(M4_USART1, UsartOverrunErr);}
        else{}
    }
    
    /*******************************************************************************
     ** rief 串口初始化
     ** param [in] None
     ** 
    etval None
     ******************************************************************************/
    void usart_init(void)
    {
        en_result_t enRet = Ok;
        stc_irq_regi_conf_t stcIrqRegiCfg;
        
        /*配置串口使用的时钟和基本通信配置*/
        const stc_usart_uart_init_t stcInitCfg = {
            UsartIntClkCkNoOutput, //使用内部时钟源,不需要在其时钟输出IO上输出通信的时钟信号
            UsartClkDiv_1,         //时钟不分频
            UsartDataBits8,        //一个字节数据用8位数据位表示
            UsartDataLsbFirst,     //先传输低位
            UsartOneStopBit,       //停止位1位
            UsartParityNone,       //无奇偶校验
            UsartSamleBit8,        //每次传输8位(1字节),也可以传输 UsartSamleBit16(16位,2字节)
            UsartStartBitFallEdge, 
            UsartRtsEnable,        //使能RTS (串口开始传输前让RTS输出一个高脉冲信号)
        };
    
        /* Enable peripheral clock *//*打开时钟*/
        PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART1 | PWC_FCG1_PERIPH_USART2 | 
        PWC_FCG1_PERIPH_USART3 | PWC_FCG1_PERIPH_USART4, Enable);
        
        /* Initialize USART IO */ /*配置相应的IO作为串口的TX,RX引脚*/
        PORT_SetFunc(USART1_RX_PORT, USART1_RX_PIN, Func_Usart1_Rx, Disable);
        PORT_SetFunc(USART1_TX_PORT, USART1_TX_PIN, Func_Usart1_Tx, Disable);
    
        /* Initialize UART *//*初始化串口配置*/
        enRet = USART_UART_Init(M4_USART1, &stcInitCfg);
        if (enRet != Ok)while (1);
        /* Set baudrate *//*设置串口波特率*/
        enRet = USART_SetBaudrate(M4_USART1, USART1_BAUDRATE);
        if (enRet != Ok)while (1);
    
        /* Set USART RX IRQ *//*设置串口接收中断*/
        stcIrqRegiCfg.enIRQn = Int000_IRQn;//设置中断优先级
        stcIrqRegiCfg.pfnCallback = &Usart1RxIrqCallback;//设置中断回调函数
        stcIrqRegiCfg.enIntSrc = INT_USART1_RI;//中断名称
        enIrqRegistration(&stcIrqRegiCfg);
        NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
        NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
        NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    
        /* Set USART RX error IRQ *//*设置串口接收错误中断*/
        stcIrqRegiCfg.enIRQn = Int001_IRQn;
        stcIrqRegiCfg.pfnCallback = &Usart1ErrIrqCallback;
        stcIrqRegiCfg.enIntSrc = INT_USART1_EI;
        enIrqRegistration(&stcIrqRegiCfg);
        NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
        NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
        NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    
        /*Enable RX && RX interupt function && UsartTx*/
        USART_FuncCmd(M4_USART1, UsartRx, Enable);//使能接收
        USART_FuncCmd(M4_USART1, UsartRxInt, Enable);//使能接收中断
        USART_FuncCmd(M4_USART1, UsartTx, Enable);//使能发送
    }

    usart.h

    #ifndef USART_H_
    #define USART_H_
    
    #ifndef USART_C_
    #define USART_C_ extern
    #else
    #define USART_C_ 
    #endif
    
    
    #include "hc32_ddl.h"
    
    /* USART1 baudrate definition */
    #define USART1_BAUDRATE                  (115200ul)
    /* USART1 TX Port/Pin definition */
    #define USART1_TX_PORT                   (PortA)
    #define USART1_TX_PIN                    (Pin09)
    /* USART1 RX Port/Pin definition */
    #define USART1_RX_PORT                   (PortA)
    #define USART1_RX_PIN                    (Pin10)
    
    
    void usart_init(void);
    
    #endif

    2.在头文件里面设置串口1波特率,还有使用哪个引脚作为串口1的发送和接收引脚

    我配置了波特率为115200;  PA9作为串口1的发送数据引脚;  PA10作为串口1的串口接收引脚

    3.串口基本的配置

    4,配置串口中断接收回调函数

    注意:中断优先级有145个:   Int000_IRQn,  Int001_IRQn,  Int002_IRQn .... Int142_IRQn,  Int143_IRQn;数字越小,优先级别越高

    4,配置串口接收错误中断回调函数

    这个应该是固定处理形式,然后应该可以去掉.

     

    5.使能

    注意!要一句一句写!不要用 USART_FuncCmd(M4_USART1, UsartRx | XXXX | XXXX , Enable);  不可以这样子用

    注意!要一句一句写!不要用 USART_FuncCmd(M4_USART1, UsartRx | XXXX | XXXX , Enable);  不可以这样子用

    注意!要一句一句写!不要用 USART_FuncCmd(M4_USART1, UsartRx | XXXX | XXXX , Enable);  不可以这样子用

    6.测试每隔一段时间发送一个字符1

            //发送字符1
            USART_SendData(M4_USART1, '1');
            //等待串口发送完成
            while (Reset == USART_GetStatus(M4_USART1, UsartTxEmpty));

    7.对于一般的用户接收数据呢用户可以按照自己的习惯去写就可以了

    增加空闲中断 (空闲中断需要用到定时器,在后面的章节介绍)

  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/14835667.html
Copyright © 2011-2022 走看看