<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.对于一般的用户接收数据呢用户可以按照自己的习惯去写就可以了