嵌入式学习笔记(综合提高篇 第一章) -- 利用串口点亮/关闭LED灯

1      前言  

  从踏入嵌入式行业到现在已经过去了4年多,参与开发过的产品不少,有交换机、光端机以及光纤收发器,停车场出入缴费系统,二维码扫码枪,智能指纹锁以及数字IC芯片开发等; 涉及产品中中既有STM和Nuvoton这类通用芯片,也有Nordic-52832,Nordic-52810,易兆微这种专用的蓝牙芯片,还包含用于WIFI设备的ESP32芯片,以及专业的指纹/二维码安全芯片,当然也参与过基于ARM9内核的Linux的嵌入式服务器开发和维护,更详细的参与了异步双核MCU的验证工作和库开发,虽然它们内核和性能参数各异,甚至开发工具也大不相同,但是经过工作积累,就会发现这些MCU的开发都有比较清晰的流程,难度往往并不在本身的驱动调试开发部分。协议/安全/稳定性,图像/GUI/视频处理,性能/电源管理/低功耗,行业相关需求,这些知识在产品开发中才是最重要的。

  在有了C语言基础,熟悉常见的开发工具如keil,Iar或者arm-gcc,了解芯片的基本I/O和寄存器配置后,底层模块的驱动在整个产品开发流程中其实是占比最少的一部分,而RTOS选用/移植,任务管理/通讯,复杂协议如(TCP/IP, USB, BLE)等的移植运用,功能逻辑实现,软/硬件功能调试,以及后期功能测试才是项目的主要部分,而这些往往是初期很难了解,也不知道如何去掌握的知识,只有从丰富的项目开发经历中才能总结出来。在我入门的过程中,也是把重点放在模块的学习上,从GPIO,Uart,中断等一步步开了解芯片的构造,可当我学习到DCMI,ETH,LTDC时,一方面模块复杂,另一方面需要配合大量的软件部分实现,往往在没有成果反馈的情况下就失去了学习钻研的兴趣,最后不得不半途而废;在入职嵌入式行业, 处理过多个产品项目后才逐渐有些明白,这些模块的复杂程度即使是熟练工,也需要花费一定时间才能去熟练掌握,基于模块的应用开发更可能需要按星期算的时间,在没有详细目的驱使的情况下,如果把重点放在去掌握整个模块的基本功能上,即枯燥也很困难(熟练掌握是重要的,但应用才是产品开发的核心,先学会用,在长时间的运用后熟练也是学习的一种方法)。在这份文档中将摒弃以模块为核心的初期积累方式,将以应用为核心,产品开发的思路为向导,先规划产品需求,在由简入难,讲诉如何将想法化作嵌入式产品的过程,以及其中遇到的困难和解决办法。

  嵌入式内部也根据行业有很多方向,如通讯行业,涉及有交换机,路由器,视频光端机,要掌握各种通讯协议,如TCP/IP, 环网协议等; 安全行业, 涉及有监控系统,支付扫码枪,指纹锁,要掌握视频,图像相关的处理知识,也要了解国密算法如SM2, SM3, HASH等,还有电源行业,涉及有充电器,适配器,就要了解BC1.2,高通QC快充以及PD协议等,其它行业没参与过,不太了解,但深入各行业之后有点很清楚,对行业的理解才是决定自己发展的最大限制,在学习和提高的过程中,可以选择更全面,但在工作中,一定要选择自己最合适的方向深入耕耘。

1.1    资料准备

  工欲善其事,必先利其器。从事嵌入式开发的学习,首先选择合适的开发芯片和开发工具当然是十分重要的,如果已经有开发板或者芯片模组,那么直接使用即可,没有的话建议选择意法半导体的STM系列芯片,原因有以下几点。

    • 产品量大,比起飞思卡尔/TI的芯片,网络上使用的人更多,遇到问题网络上也更容易找到解决问题的办法。
    • ST作为比较早进入中国的公司,对于资料方面中文化更全面(嵌入式开发英文很重要,但中文更适合入门)。
    • 国内单片机方面的开发板也是以ST的居多,如比较出名的正点原子,野火等,也更好选择,新人购买也建议选择这些开发板,功能应用齐全。

  当然目前因为手里只有一块之前购买ST的STM32F7-Discovery,使用STMF746G芯片,因此就以此为核心进行后续应用的开发和总结,另外因为个人熟悉程度和常用开发,选择MDK5作为开发工具。做好准备后,就开始第一个课题:利用串口点亮/关闭LED灯,具体要求如下:

    • 上位机带软件界面,有两个按键分别控制开灯/关灯
    • 下位机可根据按键控制LED,有一定的扩展性(后续支持其它功能?)

  资料/设备(本文档所在的资料文件内有附加工具/文档):

    • 开发板STM32F7-Discovery
    • USB转串口工具
    • 笔记本一台
    • USB供电线,用于打印
    •  文档若干(stm32f7-discovery原理图, STM32F7x参考手册(中文), STM32F7数据手册)

  准备好上述工具,就可以开始需求的正式的功能开发了,首先要确定开发需求涉及到的知识点,上位机软件因为有窗口和串口,那么使用C#/或者Python+PyGUI都可以,个人擅长C#,因此选择C#写上位机软件; 至于下位机因为要采集串口数据,并控制LED,因此涉及到USART-输入/GPIO两个模块,考虑到会用到打印调试,因此USART-printf也最好实现,另外考虑到实时性和架构的需求,USART使用中断模式为佳,总结下整个开发就包含下面流程:

    • 下位机GPIO,USART,中断模块的驱动实现
    • 上位机软件开发
    • 上位机/下位机交互的规则,以及对实际硬件的操作

1.1     硬件驱动实现

   不过因为初期可以用串口工具模拟上位机软件,因此首先进行驱动实现和交互协议规则实现,驱动的实现在有一定单片机基础后并不困难,首先确认对应的硬件的实际接口,具体如下:

  LED -- GPIOI1

  USART1 TX -– PA9

  USART6 TX –- PC6, RX – PC7

  具体参考《stm32f7-discovery原理图》,详细如下

图 1 硬件原理图

  确定了硬件之后,就开始驱动的编写,这里可以简化总结下窍门,对于涉及硬件但不涉及复杂协议的接口,如USART,I2c或者SPI等,硬件接口的实现一般包含以下几部分:

  1. 使能模块对应RCC的时钟(包含对应GPIO模块和应用模块)
  2. 配置对应的硬件GPIO口,单纯GPIO这一步结束,接口则配置为相应的复用模式
  3. 配置硬件模块,使能
  4. 如果开启中断,需要配置相应的优先级,并实现中断函数。

  根据上述说明,LED的初始化函数如下(具体配置说明参考STM32F7x参考手册)

void  led_gpio_init(void)
{

   //使能GPIOI的时钟
   RCC->AHB1ENR |= 1<<8;


   
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值