华大单片机 HC32F460 串口调试

吐槽下,华大官方例程写到太复杂了,不熟练的一时摸不上手.

#include "drvs.h"
/******************************************************************************** 云平台接口* AP9  USART1_TX* PA10 USART1_RX******************************************************************************//******************************************************************************** 局部类型定义('typedef')******************************************************************************/
/* 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)
#define UART1_REC_LEN           64      //定义USART1最大接收字节数
#define USART_COUNTER_9600    3         //接收超时typedef struct _UART_FLAG_STRUCT
{uint8_t UART1_Flag;                    //数据接受完成标志uint8_t UART1_String[UART1_REC_LEN];//最大长度,自定义uint8_t UART1_Counter;               //收到的数据长度,计数作用uint8_t usart1_start;              //接收开始,定时器计时启动uint8_t usart1_counter;                //定时器计时次数
}   Uart1_FlagSt;Uart1_FlagSt Uart1FlagData;//申请结构体变量/********************************************************************************* \brief USART RX irq callback function.//串口接收中断函数** \param [in] None** \retval None******************************************************************************/
static void Usart1RxIrqCallback(void)
{   if(Uart1FlagData.UART1_Counter<UART1_REC_LEN)//总长度{Uart1FlagData.UART1_String[Uart1FlagData.UART1_Counter]=USART_RecData(M4_USART1);//读数据   Uart1FlagData.UART1_Counter++;//收到的数据个数+1Uart1FlagData.usart1_start=1;//定时器开始工作Uart1FlagData.usart1_counter=0;}else Uart1FlagData.UART1_Counter=0;//如果接受的数据超过设定值,则清空接收值,防止数据溢出
}/********************************************************************************* \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;/* 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);/*配置串口使用的时钟和基本通信配置*/const stc_usart_uart_init_t stcInitCfg = {UsartIntClkCkNoOutput, //使用内部时钟源,不需要在其时钟输出IO上输出通信的时钟信号UsartClkDiv_1,         //时钟64分频 200000/64UsartDataBits8,        //一个字节数据用8位数据位表示UsartDataLsbFirst,     //先传输低位UsartOneStopBit,       //停止位1位UsartParityNone,       //无奇偶校验UsartSampleBit8,        //每次传输8位(1字节),也可以传输 UsartSamleBit16(16位,2字节)UsartStartBitFallEdge,  //起始位:RD pin下降沿UsartRtsEnable,        //使能RTS (串口开始传输前让RTS输出一个高脉冲信号)};/* 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;//中断名称enIrqResign(Int000_IRQn);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;enIrqResign(Int001_IRQn);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, UsartTx, Enable);//使能发送USART_FuncCmd(M4_USART1, UsartRx, Enable);//使能接收USART_FuncCmd(M4_USART1, UsartRxInt, Enable);//使能接收中断
}   /********************************************************************************* \brief 发送一串数据** \param [2] unsigned char *data ** \retval None******************************************************************************/
void Uart1_SendString(unsigned char *data,unsigned char strlen)
{unsigned char dataleng;for(dataleng=0;dataleng<strlen;dataleng++){USART_SendData(M4_USART1,data[dataleng]);while (Reset == USART_GetStatus(M4_USART1, UsartTxEmpty));//等待发送完成}
}/********************************************************************************* \brief 串口定时器一帧结束标志          定时器中断10MS调用1次** \param [in] None** \retval None******************************************************************************/
void UART1_InsetTimer(void)
{if(Uart1FlagData.usart1_start==1)//此标志位是在串口接收数据时候会置1{Uart1FlagData.usart1_counter++;//定时器计数标志位if(Uart1FlagData.usart1_counter>USART_COUNTER_9600)//如果超过波特率为9600时一个字节的所需要的时间,时间计算方法下面有讲解{Uart1FlagData.UART1_Flag=1;//接收完成标志Uart1FlagData.usart1_counter=0;//计数值清零Uart1FlagData.usart1_start=0;//计数器启动标志位置0}}
}//串口发送测试
void USART_CS(void)
{if(Uart1FlagData.UART1_Flag==1){Uart1FlagData.UART1_Flag=0;Uart1_SendString(Uart1FlagData.UART1_String,Uart1FlagData.UART1_Counter);Uart1FlagData.UART1_Counter=0;}}//串口写函数
int uart_1_w(int fd,void *buf,int len)
{if(len>0 && len<=128){Uart1_SendString(buf,len);return len;}return -1;
}//串口读函数
int uart_1_r(int fd,void *buf,int len)
{if(Uart1FlagData.UART1_Flag==1){int uart =0;Uart1FlagData.UART1_Flag=0;char * data =(char *)buf;memcpy(data,Uart1FlagData.UART1_String,Uart1FlagData.UART1_Counter);uart =Uart1FlagData.UART1_Counter;Uart1FlagData.UART1_Counter = 0;return uart;}return -1;
}void USART1_INIT_YUN(void)
{usart_init();                 //注册串口初始化rxm_reg_w(DEV_UART1,&uart_1_w);//注册串口写驱动rxm_reg_r(DEV_UART1,&uart_1_r);//注册串口读驱动rxm_addtim(60,&USART_CS);      //注册软件定时器串口测试函数
}DRV_INIT(USART1_INIT_YUN);     //装载函数

总结:管脚设置和STM32不同 需注意

 /* 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);

初始化要一句一句写 需要注意

/*Enable RX && RX interupt function && UsartTx*/
USART_FuncCmd(M4_USART1, UsartRx, Enable);//使能接收
USART_FuncCmd(M4_USART1, UsartRxInt, Enable);//使能接收中断
USART_FuncCmd(M4_USART1, UsartTx, Enable);//使能发送

系统时钟较高时需要调节分频系数需要注意

华大单片机 HC32F460 串口调试相关推荐

  1. 华大单片机HC32F460 系列MCU

    1 摘要 本篇应用笔记主要介绍如何使用华大单片机 HC32F460 系列MCU的 DMA 模块传输数据. 2 DMA 简介 什么是 DMA? DMA(直接内存访问控制器)功能块可以不通过 CPU 高速 ...

  2. 手把手教程1: 华大单片机HC32F460如何新建工程(ddl库版本)

    华大单片机HC32F460如何新建工程(ddl库版本) 目录 华大单片机HC32F460如何新建工程(ddl库版本) 准备工作 正式工作 开发板请点击:  https://item.taobao.co ...

  3. 华大单片机 HC32F460 驱动BM8563ESA RTC芯片

    前言 因华大单片机没有单独VBAT管脚,无法使用,如果用单片机自带的RTC模块,系统断电后时间无法准确,需要重新设置,影响用户体验,说以系统加入单独的RTC芯片. RTC时钟电路 单片机管脚定义 RT ...

  4. 华大单片机 HC32F460 调试管脚 SWCLK SWDIO PA15 PB3 PB4引脚复用问题

    耶稣说:施比受更为有福 直接上图 第一次LCD显示屏没有用PA15 ,改版把它放到PA15上,发现显示屏不显示了.管脚初始化以后变成高组态模式了. 程序 void LCD_GPIO_Init(void ...

  5. 华大单片机HC32F003串口发送一个字节数据后死机问题

    本人最近在使用HC32F003单片机做一个项目中遇到串口发送完成后程序出现跑飞死机现象,第一次出现这个问题,之前使用HC32L136时候就没有这个问题. HC32F003有2个异步串口功能,如图下为串 ...

  6. 国产(华大)单片机 hc32f460入门

    最近闹芯片慌,黄牛各种炒作,芯片价格居高不下,暂时选择国产方案替代. 本次选用了华大 m4内核方案, hc32f460芯片,型号很多,64pin的 keta(该版本实际有货),100脚的petb(实际 ...

  7. 华大单片机 HC32F460 驱动74HC595D

    在我刚学单片机时总是感觉很难理解,今天分析下74HC595串口转并口 IO扩展芯片,一般我们在IO口不够用的情况下才能祭出此神器. 那么我们如何驱动此神器呢? "念咒:天灵灵地灵灵,Q1开& ...

  8. 华大单片机HC32L072KATA低功耗调试笔记

    硬件工程师做的测试自制最小系统,系统 供电3V 测试目标: 使用原厂的例程,修改GPIO配置后的代码 按键进入深度睡眠状态, 再次按键,唤醒,点亮LED灯2秒. 测试过程: 测试第一次发现,深度睡眠后 ...

  9. 华大单片机HC32L130F8UA 串口烧录程序

    一.准备工作 1.开发板 2.串口模块 3.串口烧录软件 4.编译好的hex文件 5.杜绑线,跳线帽等 二接线 HC32L130F8UA->GND <-------->  串口模块- ...

最新文章

  1. Lazada促进买家快速下单的方法是什么?店铺优惠劵使用技巧必须要知道
  2. python编程规范 谷歌_Python最新编程规范,新手必学
  3. Linux diffstat命令
  4. xp python转化为exe_使用Py2exe从python脚本生成的exe在xp上不起作用
  5. Qt4_实现其他菜单
  6. 21天学通java 3_《21天学通Java》PDF 下载
  7. 用GVIM/VIM写Verilog——VIM配置分享
  8. [洛谷U22157]刷水题(数位dp)(hash)
  9. linux lsof命令语法
  10. NDK开发之数组操作
  11. x.view(-1,4)
  12. java静态声明调用_求问 static声明的方法不是只能调用静态属性或者方法吗?
  13. 深入浅出WPF笔记——Binding
  14. cs224n课程及NLP相关知识记录
  15. Android多媒体框架
  16. 黑龙江软件第三方检测机构/软件登记(退税)测试报告
  17. 小甲鱼Python3笔记
  18. 面试题:“你的职业规划是什么?”
  19. Carsim与Simulink联仿Carsim找不到Matlab错误的解决方案,此前装过多个Matlab版本出现该问题可以尝试此方法
  20. obsidian apk下载办法

热门文章

  1. 注册表禁止修改系统时间
  2. 安装ros导航包,teb_local_planner步骤
  3. web前端工程师需要掌握哪些知识
  4. JQuery模板 :(六)JsViews - 基于JsRender并具有动态绑定功能的模板
  5. 【2】python算法练习--动态规划专题(1)
  6. ubuntu 安装OpenCV3版本后安装OpenCV4,且多版本共存
  7. ITV和IPTV的区别
  8. 动画程序时长缩放是什么意思_Pr预设:2000种文字标题排版指示线图形动画无缝转场剪辑工具包...
  9. 批量处理实验接触角数据-MATLAB分析
  10. 医疗器械计算机系统审评准则,医疗器械注册审评管理系统