关于stm32f407 串口程序编写过程 总结

发布者:二进制游侠最新更新时间:2018-12-26 来源: eefocus关键字:stm32f407  串口  程序编写 手机看文章 扫描二维码
随时随地手机看文章

一.背景介绍


        17/07毕业,通过完成试用期的几个小项目,感觉自己能独立的完成部分项目,便接手了配合硬件工程师,将公司模块升级的任务(M3-->M4)


        目标:


        1.bootloader更改


        2.将rt_thread 系统移植到 stm32f407板子上


        3.将485,can , gsm ,以太网 驱动接口补上


        4.重新设计程序收发流程,完成实时收发数据


    (数据字典,wwdg  , 校验设计,对上,对下的协议修改等等 ,这些已在之前完成,只要调用响应接口,调试下即可)






二.目标实现


目标1.bootloader更改


          通过学习之前模块的代码,对整个bootloader流程有了大致的了解,学习flash的机构跟读写方法等


          1.更改对应的flash 信息,根据选择的芯片,通过编程手册或跟硬件工程师交流


            更改: 


            #define PAGE_SIZE   (0x800) /* 2 Kbytes */


            #define FLASH_SIZE   (0x100000) /* 1 MByte */


            #define USER_FLASH_END_ADDRESS        0x08100000  //1MB


            #define APPLICATION_ADDRESS   (uint32_t)0x08004000 //16KB     app 启动地址


           2.更新代码,将沉余代码删除,在keil5中一步步运行,删除多余代码,大体代码不做更改


              因为有打印信息需求,所以设置了485,在此之前先要理清概念:串行,并行,单工,半双工,全双工,同步/异步通信


       在此处不做介绍,大家百度下即可。


             usart:        1.对应时钟配置

                              2.有复用,就添加复用映射

                              3.管脚配置—管脚初始化

                              4.串口配置----串口初始化

                              5.配置中断


                              6.库函数包含中断跟发送     




           代码中有用到f_open 等,那必须得实现文件系统功能,通过SPI来实现,那就必须了解SPI的设置,功能等 


            SPI:串行外设总线,使MCU与各种外围设备以串行方式进行通信以交换信息。

            (1)MOSI

            (2)MISO

            (3)SCLK 


            (4)CS


            SPI:管脚配置

            1.配置使能管脚

            2.配置剩余三个管脚

            3.添加复用映射

            4. SPI口初始化

            5.使能SPI外设,启动传输  


            6. 库函数包含中断跟发送-------规则如nand flash  注意片选的使能


            其他改动不大,在 IAP_BOOT()函数中实现程序的跳转,进入app


            通过自测,将一个点灯的bin 文件放到对应的地址,boot函数会跳转到该地址,实现灯闪烁即OK


目标2:将rt_thread 系统移植到 stm32f407板子上


      知识储备:结合rt_thread编程手册,对rt_thread系统运行过程有个大致了解


      这个比较简单,在RT_Thread 官网上下载对应板子的bsp即可,编译keil,将未实现的函数库copy过来即可


     存在问题,你要注意bootloader的跳转地址,以及keil 里面配置的地址,还有app 程序里面的设置地址要对应起来 (如果地址不对应,可能会跑飞,之前遇到这个问题)


此处,先不用btloader跳转


通过编译之后,运行程序,检测到程序在idle里跑就行了,说明系统挂起来了



此处,先目标3.将485,can , gsm ,以太网 驱动接口补上


        需要学习相关串口的知识


(1)485


           485的设置不难,之前介绍过,在系统里面找到或添加对应的串口设置,实现对应的中断即可


            在rt_thread中要将finsh 跟 485关联起来,<




(2)can 


        学习can 的相关收发知识,以及相关程序的运行。


        can的配置不难


        Can配置:

        1.对应时钟配置

        2.有复用,就添加复用映射

        3.管脚配置—管脚初始化

        4.CAN单元配置

        5.过滤器配置

        6.优先级配置

        7.库函数包含中断跟发送


        主要问题:两个板子的对应的晶振不一致,这个需要在过滤器中配置,但是我将can过滤器设置之后还是出现收发错误


就开始找原因了,最后在函数 static rt_err_t bxcan_set_privmode(CAN_TypeDef *pcan, rt_uint32_t mode)中发现


    pcan->BTR = (mode                         | \

                 ((BAUD_DATA(SJW, baud_index)) << 24) | \

                 ((BAUD_DATA(BS1, baud_index)) << 16) | \

                 ((BAUD_DATA(BS2, baud_index)) << 20) | \


                 (BAUD_DATA(RRESCL, baud_index)) - 1);


知道对应的BAUD_DATA实现,更改了对应的过滤器设置,调试通过


// {1000UL * 500, MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_9tq,  CAN_BS2_2tq, 6)},//36M


{1000UL * 500, MK_BKCAN_BAUD(CAN_SJW_1tq, CAN_BS1_7tq,  CAN_BS2_6tq, 6)},//42M


(3)SPI+DMA


        学习SPI跟DMA


       需要挂载文件系统,就需要用到SPI了,我看原来的代码通过SPI+DMA来实现,我将原先的库函数更换成M4的,将其配置改成M4的配置,发现实现不了。


原因:  两块芯片的flash不一样,此处只要将对应的初始化函数更改下,配上对应的flash,文件系统即可加载成功



(4)以太网


注意管脚配置即可


stm32f407 以太网驱动移植 在:

RT-Thread编程指南 -----   lwIP - 轻型TCP/IP协议栈  这一章写的很详细了,有需要的小伙伴可以去看下

RT-Thread中将lwIP应用起来主要包括三个核心步骤:

1. 创建收发包线程,调用接口eth_system_device_init()。

2. 提供网卡驱动,调用网卡初始化函数,注册网卡设备。(驱动不同相应的接口函数可能不同)


3. 初始化lwIP,创建lwIP线程,调用接口  lwip_sys_init()(实际调用的lwip_system_init())。


之后,在主线程上写了个tcpserver(编程手册里有代码) ,用QT写了client 实现了数据的收发,并完成测试


至此完成485,can,gsm,以太网的接口实现,之后就等新板子来了把管脚一调就可以测试了


小技巧:通过Xmind 将程序通过思维导图的方式写在上面,方便程序的添加更改,查找更便利

关键字:stm32f407  串口  程序编写 引用地址:关于stm32f407 串口程序编写过程 总结

上一篇:STM32笔记--SDIO(SD卡读取)
下一篇:SD卡及STM32的SDIO接口相关原理

推荐阅读最新更新时间:2024-03-16 16:21

MCS251和PC机间的串口通信电路设计
  随着计算机技术的快速发展和广泛应用,上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS2232或者RS2485接收、发送数据和传送指令。单片机可单独处理数据和控制任务,同时也将数据传送给PC 机,由PC 机对这些数据进行处理或显示。本文介绍PC 机和单片机通信在一种基于 C8051F  单片机的波形发生器中的应用,在上位机上显示正弦波的幅值和频率,由上位机发送指令可以改变波形幅度及频率。    硬件电路的设计   MCS251 单片机有一个全双工的串行通讯口UART,利用其RXD 和TXD
[电源管理]
MCS251和PC机间的<font color='red'>串口</font>通信电路设计
stm32的串口调试卡死问题
且看这次出现的bug是一直等待, while(USART_GetFlagStatus(USE_Usart,USART_FLAG_TC)==RESET); 这个有很多说法 不过本人处理的方法是加入了一个一行代码就好了 NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);
[单片机]
s3c2410/s3c2440串口波特率的计算
要正确计算串口波特率,首先要搞清楚芯片的时钟工作原理,这部分在s3c2410/s3c2440datasheet上写的比较详细,但对新手来说结合thisway同志“s3c2410完全开发流程”中的TIMER和CLOCK两个实验,边做实验边看资料,更容易理解。 我这里只根据我的失败经验谈一下设置波特率寄存器UBRDIVn的值的计算要注意的一个问题。 datasheet上UBRDIVn寄存器部分写着: UART BAUD RATE DIVISOR REGISTER There are three UART baud rate divisor registers including UBRDIV0, UBRDIV1 and U
[单片机]
基于AT89C52单片机实时时钟程序编写
#include‘reg52.h’ //包含单片机寄存器的头文件 #include‘intrins.h’ //包含_nop_()的头文件 sbit RS=P2^0; //LCD读写选择位 sbit RW=P2^1; //LCD读写选择位 sbit E=P2^2; //LCD使能端 sbit BF=P0^7; //忙信号 sbit SCLK=P1^0; //1302时钟输出端 sbit DATA=P1^1; //1302数据端 sbit RST=P1^2; //1302复位端 unsigned char code digit[]=“0123456789”; void delay1ms(unsigned int n) { un
[单片机]
基于AT89C52单片机实时时钟<font color='red'>程序</font><font color='red'>编写</font>
初识stm32-----串口1的字符串与字符的发送
STM32的串口1的字符串与字符的发送,一开始卡在不知道怎么把字符串发出来,参考别人的代码之后的程序如下: (虽然最后成功但是还需要努力ヾ(◍°∇°◍)ノ゙) PS:本程序模板用的是正点原子的模板。 主程序: #include stm32f10x.h #include usart.h void Delay(u32 count) { u32 i=0; for(;i count;i++); } void show() { GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits(GPIOE,GPIO_Pin_5); Delay(3000000); GPIO_
[单片机]
51单片机串口理论概念解析
理论概念 不同型号的单片机使用的串口不同,根据需求选择相应的单片机,在有些场合如果单片机如果没有需要的串行通信接口,则可以通过单片机的I/O口进行模拟。 全双工UART(异步串行通信接口) UART有两种工作状态: 同步串行通信状态:速率高,硬件电路复杂,需要同时使用两条信号线,所以只能使用单工方式或半双工方式工作。 异步串行通信状态:方式简单,传输速率不高,应用广泛,方便与其他通信标准进行衔接。 异步传输工作方式: 传输效率较低,起始位,校验位,停止位占用的位较多 数据格式: 同步传输工作方式: 双方同时使用两条通信线: 一条用于产生时钟并要求发送和接受的双方必须保持完全同步(一般情况下,时钟信号由发送端提供)。另一条
[单片机]
51单片机<font color='red'>串口</font>理论概念解析
STM32串口如何代码实现更高效的接收消息
摘要 本文介绍设计一个环形队列数据结构以实现串口更稳定的接收消息,并有效防止丢包 。 这段时间一直在研究多旋翼飞行器,以及其它的事情,博客好外没更新,再不坚持怕真荒废了哦。 在上篇简单实现MAVLink协议的解析,并演示按照设计好的命令执行对应的事件处理,以及又加入 CRC校验,实现更稳定的通信,但在上文结束时也提到当对一个包进行解析及对应事件处理时,是不能接收新的数据,直到事件处理完成,Msg_Rev.Get 状态设置为 RECEIVING 后方能再接收新的数据。这时,当事件处理需要一定时间,而又有新的数据不断发送过来时,很容易造成数据丢失现象。 如何提高串口通信效率,并避免丢包现象了? 为提高效率,首先想到采用DMA方式,然而
[单片机]
嵌入式系统中串口通信帧的同步方法
引 言 串口通信是日前单片机和DSP等嵌入式系统之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式。在嵌入式系统的硬件结构中,通常只有一个8位或16位的CPU,不仅要完成主流程的工作,同时还要处理随时发生的各种中断,因而嵌入式系统中的串口通信程序设计与PC机有很大的不同。若嵌入式系统中.中断服务子程序在系统运行过程中占用了较多的时间,就有可能在中断眼务子程序正运行时,又产生一个同类型或其他类型的中断,从而造成主程序得不到执行或后续中断数据丢失。所以,嵌入式系统中的串口通信虽然看似简单,但其中仍有许多问题值得研究,例如串口通信过程中的帧同步问题。本文针对该问题给出了逐次比较、基于FIFO队列和基于状态机的
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved