专栏首页知识分享2-4-HC32F460(华大)+BC260Y(NB-IOT)基本控制篇(自建物联网平台)-基础外设例程-串口(基本使用)

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"


/*******************************************************************************
 ** \brief USART RX irq callback function.//串口接收中断函数
 ** \param [in] None
 ** \retval None
 ******************************************************************************/
static void Usart1RxIrqCallback(void)
{
    uint16_t m_u16RxData;
    m_u16RxData = USART_RecData(M4_USART1);//获取串口接收的数据
}

/*******************************************************************************
 ** \brief USART RX error irq callback function.(串口接收错误中断处理函数)
 ** \param [in] None
 ** \retval 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{}
}

/*******************************************************************************
 ** \brief 串口初始化
 ** \param [in] None
 ** \retval 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.对于一般的用户接收数据呢用户可以按照自己的习惯去写就可以了

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2-2-HC32F460(华大)+BC260Y(NB-IOT)基本控制篇(自建物联网平台)-基础外设例程-GPIO输出高低电平

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTA_BC260Y/my.h...

    杨奉武
  • 2-1-HC32F460(华大)+BC260Y(NB-IOT)基本控制篇(自建物联网平台)-基础外设例程-工程模板使用说明

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTA_BC260Y/my.h...

    杨奉武
  • 2-3-HC32F460(华大)+BC260Y(NB-IOT)基本控制篇(自建物联网平台)-基础外设例程-GPIO引脚电平检测

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTA_BC260Y/my.h...

    杨奉武
  • 1-HC32F460(华大)+BC260Y(NB-IOT)基本控制篇(自建物联网平台)--硬件使用说明

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTA_BC260Y/my.h...

    杨奉武
  • 什么是窄带物联网(NB-IoT)?

    随着数十亿设备在不久的将来上线,我们将需要能够支持它们的无线网络。窄带物联网(NB-IoT)是否是解决方案?

    用户4122690
  • 2月24日数据动态早报| 电商大数据助力中国外贸企业转型升级

    数据动态,让您了解数据新变化、新创造和新价值。 ? ---- 一、通信行业数据动态 1 华为厚积薄发在物联网风口起舞。率先提出无线窄带蜂窝物联网技术,是NB-I...

    陆勤_数据人网
  • 无人配送中的IOT

    自动驾驶是一个终将改变世界的技术,而我们始终坚信,在实现自动驾驶的路上,作为细分场景的无人配送将更快地实现落地,从而给人们的生活带去更多有趣的体验。而在无人配送...

    美团无人配送
  • NB-IoT 的“前世今生”

    根据《爱立信2018移动报告》(Ericsson Mobility Report,June 2018)的预测,蜂窝物联网设备连接数将在2023年达到35亿,年增...

    个推
  • 《NB-IoT 端到端优化分析》

    NB-IOT网络端到端产业链条长,涉及产品多,整个业务过程与模组终端、无线网络、核心网、IOT平台、应用服务器等多网元相关,且物联网终端数量多,普遍上报周期长,...

    用户6184845

扫码关注云+社区

领取腾讯云代金券