#申请原创# @21小跑堂
@21小跑堂
引:
这个文章主要是针对于刚刚使用一款新的单片机,以及过程中遇到的“坑”,进行的一次可以落地的总结。我们经常忽略的事情,往往是最关键最紧要的事情,而不是可以随意马虎的事情,我们对待技术马虎,那么技术也会反噬我们的时间。
思路的由来,是因为客户这边的一个需求,需要在HC32F005单片机上进行开发,对于一个陌生的单片机,需要上网下载一些芯片资料,来到小华单片机官网进行寻找,找到很多资料包。进行分类整理。以便后续使用。
一、文件list
对于熟悉华大单片机而言,这些文档应该都已经熟读于心了。而对于老刘这样的新手而言,还是摸不到头绪。既然摸不到头绪,我们就要从几步进行。以下是老刘绘制的项目流程图,可以进行借鉴和参考。
二、 老刘的项目流程图
三、卡在了哪里?
第一坑:
在对例程的通讯部分进行仿真的时候,发现无法仿真,根本找不到芯片。怎么办?
进行电源检查,没有问题;
进行原理图检查,也没有问题;(原理图是按照网上购买的单片机最小系统板进行绘制的。)
查看是不是外部晶振使用的8MHz对单片机进行影响,结果不是这个原因;
更换仿真器,试验了J-link、试验了创新工坊的仿真器,都找不到芯片;
查看芯片的RST引脚的接法是否正确,依然不是这个问题。
最终发现,在给线路板进行打丝印的时候,RST的丝印和DIO的丝印放错了位置,互换之后,问题解决。以后进行标注丝印的时候,应该多注意一下,两个不一样的丝印会耽误很多时间。
终于找到了芯片,也能够仿真了。松了一口气;本以为一路畅通,结果还有下面的问题。
第二坑:
进行串口通讯的时候,发现只有第一个字节正确,其它的字节是错误的,第一个想到的就是波特率的问题。于是进行如下的尝试。
在论坛上发帖子进行求助,看看是否有人遇到相似的问题。
在华大的QQ技术支持群进行求助,看看是否有人遇到相似的问题。
查看软件手册,主要是针对串口部分进行尝试。
看了之后,一头雾水,这都是什么,怎么出现这么多的模式,和我的认知有很大的偏差。仔细阅读各种模式,代码进行多次尝试。收效甚微。
4. 代码部分
串口初始化部分
static void App_UartInit(void)
{
stc_uart_cfg_t stcCfg;
_UartBaudCfg();
stcCfg.enRunMode = UartMode1;//测试项,更改此处来转换4种模式测试
Uart_Init(M0P_UART1, &stcCfg);
///< UART中断配置
Uart_EnableIrq(M0P_UART1, UartRxIrq);
Uart_ClrStatus(M0P_UART1, UartRC);
EnableNvic(UART1_IRQn, IrqLevel3, TRUE);
}
串口配置部分代码
static void _UartBaudCfg(void)
{
uint16_t timer=0;
stc_uart_baud_cfg_t stcBaud;
stc_bt_cfg_t stcBtCfg;
DDL_ZERO_STRUCT(stcBaud);
DDL_ZERO_STRUCT(stcBtCfg);
//外设时钟使能
Sysctrl_SetPeripheralGate(SysctrlPeripheralBt,TRUE);//模式0/2可以不使能
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);
stcBaud.bDbaud = 0u;//双倍波特率功能
stcBaud.u32Baud = 9600u;//更新波特率位置
stcBaud.enMode = UartMode1; //计算波特率需要模式参数
stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); //获取PCLK
timer = Uart_SetBaudRate(M0P_UART1, &stcBaud);
stcBtCfg.enMD = BtMode2;
stcBtCfg.enCT = BtTimer;
Bt_Init(TIM1, &stcBtCfg);//调用basetimer1设置函数产生波特率
Bt_ARRSet(TIM1,timer);
Bt_Cnt16Set(TIM1,timer);
Bt_Run(TIM1);
}
时钟初始化部分
//时钟初始化配置
void App_ClkInit(void)
{
stc_sysctrl_clk_cfg_t stcCfg;
///< 开启FLASH外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE);
///<========================== 时钟初始化配置 ===================================
///< 因要使用的时钟源HCLK小于24M:此处设置FLASH 读等待周期为0 cycle(默认值也为0 cycle)
Flash_WaitCycle(FlashWaitCycle0);
///< 时钟初始化前,优先设置要使用的时钟源:此处设置RCH为4MHz
Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);
///< 选择内部RCH作为HCLK时钟源;
stcCfg.enClkSrc = SysctrlClkRCH;
///< HCLK SYSCLK/1
stcCfg.enHClkDiv = SysctrlHclkDiv1;
///< PCLK 为HCLK/1
stcCfg.enPClkDiv = SysctrlPclkDiv1;
///< 系统时钟初始化
Sysctrl_ClkInit(&stcCfg);
}
代码没有任何的问题。
5. QQ群的小伙伴问VCAP是否接错了,查看了一下原理图,没有错误,接两个电容到GND;
6. 论坛的小伙伴回复,你修改模式1或许有惊喜。更改之后,问题解决。
总结:数据手册上说的已经很明白了,模式1为异步模式全双工。还是看datasheet不全面造成的问题,卡了两天的时间。不能马虎的。
四、继续仿真
那就发送2023666666来测试一下吧。
一切顺利。
结:
或许我们会走一些弯路,但是相信结果是好的,一个朋友问我,半年内你是否有一件事情是自己不想做,还在坚持做的呢?我说,你或许有,你都坚持加班三年了。
|
楼主这算给大家填坑了!
新的MCU开发最该注意的还是细节,总结失败经验,减少因粗心造成的错误。