STM32
直播中

一说就是错

12年用户 532经验值
私信 关注
[问答]

如何去实现基于STM32开发板去点亮LED的设计

如何去实现基于STM32开发板去点亮LED的设计?控制LED灯的步骤有哪些?

回帖(1)

张倩

2021-11-3 10:06:51
  基础知识:
  1. STM32库
  这个库是针对STM32开发板提供的函数接口,可以用来配置寄存器。采用库开发的方式,使用结构体封装寄存器参数,用宏表示参数,用函数封装对于寄存器的操作。
  2. Cortex-M3芯片
  ARM公司设计内核,其他厂商设计之外的部件(片上外设如串口,定时器)。解决兼容性问题提出了CMSIS标准,这一层位于硬件与OS或者用户层之间,屏蔽了硬件差异,提供简单的接口。CMSIS核心层是标准中最重要的部分,包含内核函数层,设备外设访问层。
  3. STM32库中的一些重要文件
  1. system_stm32f10x.c
  设置系统时钟和总线时钟
  2. stm32f10x.h
  包含了STM32中的寄存器地址和结构体类型定义,在使用固件库的地方都要包含它
  3. 启动文件
  任何处理器在上电复位后最先运行的一段汇编程序,为C语言的运行建立环境。如我们使用的是STM32F107VC系列的产品,故采用startup_stm32f10x_cl.s为启动文件。
  4. misc.c
  提供外设对内核中的中断向量控制器(NVIC)的访问函数,配置中断时必须添加该文件。
  5. stm32f10x_conf.h 和stm32f10x_it.c
  conf是用来配置使用了什么外设的头文件,添加或删除外设驱动函数库,配置是否使用断言编译选项等。
  It用来编写中断服务函数,已经定义了一些系统异常的接口。
  6. stm32f10x_gpio.c 和 stm32f10x_rcc.c
  用于操作I/O和配置系统时钟及外设时钟(必须添加)。
  7. 固件库文件间的关系
  1. 用户层:
  stm32f10x_conf.h 片上外设配置
  stm32f10x_it.h / stm32f10x_it.c 中断服务函数
  xxx.c 用户自定义的文件
  2. CMSIS层:
  misc.c等,
  8. 点灯工程的文件(我建立的不标准,在配置环境时选择了需要的库就没有像书上建立很多文件夹,分门别类放文件)
  初步建立点灯工程:
  1. 新建工程,选择开发板型号,所要包含的库文件,然后新建user文件夹,创建用户自定义文件
  2. 配置工程:
  第一个宏使用ST的官方库,第二个宏是根据芯片而定,CL是我们使用的芯片系列对应的文件名缩写。
  选择我们使用的调试器,选择使用的DLL以及相应参数。
  3. 编译和下载程序
  我们需要修改USER文件夹下的main.c,stm32f10x_it.c,xxx.c,xxx.h。
  注:我没找到stm32f10x_it.c
  两种下载方式:Keil自带的LOAD按钮和串口下载(需要mcuisp,一个小软件,我没用过)
  软件仿真有问题,我们采用直接把程序注入开发板运行的方式:
  把ST 调试器和STM32输出端的USB口接到电脑上,在电脑上下载更新驱动(控制面板,设备管理器中)
  我们使用的LED灯属于GPIOB(PB的含义),引脚为0,1,14,15
  驱动更新完成后,可以出现调试设置。
  点击LOAD,把程序注入到STM32的芯片中,可以开始运行。
  分析点灯工程:
  1. GPIO
  A-G组引脚。每组有16个引脚。
  控制LED灯的步骤:
  1.选引脚如PC3
  2.配置功能,如利用GPIOA_CRL/CRH等寄存器配置低八位/高八位引脚。
  3.设置GPIO输出电压的高低。如让GPIOA_BSRR端口位设置清除寄存器的BR3/BS3=1,可以使引脚输出低/高电平。
  2. 地址映射
  把芯片上的存储器或I/O资源等与地址建立一一对应的关系。
  Cortex-M3有32根地址线,寻址空间为4GB,其中0X40000000(外设基地址PERIPH_BASE)-0X5FFFFFFF共512MB地址给片上外设,对应着片上外设的寄存器。Stm32f10x.h就是做地址映射的,类似一张大表。
  主要的有APB2总线(挂载GPIO,ADC,串口1等外设,还有APB1,AHB总线)外设基地址0X40010000(APB2PERIPH_BASE),寄存器组基地址GPIOx_BASE,我们可以利用(GPIO_TypeDef*)GPIOC_BASE,使得地址转变为结构体指针类型,这样可以利用GPIOC-》CRL等方式访问寄存器。
  3.时钟
  分为高速/低速/外部/内部时钟。使用外设时,一定要开启时钟。
  重要时钟:
  1. SYSCLK:系统时钟,是STM32大部分部件时钟来源,由AHB预分频器分配到各个部件。
  2. HCLK:由AHB预分频器直接输出得到,是高速总线AHB的时钟信号,提供存储器,DMA,Cortex内核使用,CPU的主频就是这个信号,与STM32运算速度和数据存取速度密切相关。
  3. FCLK:也由AHB预分频器输出得到,自由运行时钟,在HCLK停止时仍可存在,在休眠时可采样到中断和跟踪休眠事件。
  4. PCLK1:外设时钟,APB1预分频器得到,最大频率36MHz,提供给APB1总线上的外设。PCLK2类似。
  代码分析:
  GPIO初始化完成后,需要设置时钟,在启动文件中调用SystemInit(),设置系统时钟SYSCLK,把配置时钟相关的寄存器都复位为默认值,再调用另一个函数SetSysClock(),根据预定义的条件编译宏来进行时钟配置,调用相应的配置函数,如SetSysClockTo72()。
  附:一些位操作方法
  a &= ~(1《《6) //左移六位的奥01000000,对第七位(bit 6)清零
  a |= (1《《6) //把第七位置1
  a ^= (1《《6) //把第七位取反
  我们可以用为操作或者直接GPIOC-》CRL等方式来操作寄存器,难得是要确定后面的数值。
  软件编译过程:
  .c ---gcc---》 .o |
  |---》 连接器脚本---》 连接器LD ---》可执行的映像文件 .afx ---》 .bin / .hex
  .s ---as(汇编器)---》 .o |
  下载到芯片FLASH的代码就是.hex文件,上电后,内核把代码加载到SRAM中执行。Flash相当于硬盘,SRAM相当于内存,在内存的代码直接运行。
  总结:
  1. 控制LED灯需要要使用GPIO外设。
  2. 了解GPIO外设的功能,要如何使用。
  3. 了解GPIO的地址映射,知道它所挂载的总线APB2。
  4. 了解ST官方库对于寄存器的封装。
  5. 了解时钟树,查看GPIOC的时钟来源,即PCLK2。
  6. 在stm32f10x_conf.h文件中包含用到的头文件stm32f10x_gpio.h,stm32f10x_rcc.h
  7. 在工程模板的基础上添加led.c,led.h用户文件
  8. 编写驱动初始化函数LED_GPIO_Config
  9. 开启外设GPIOC时钟,分析有SystemInit()配置的默认的72MHz的时钟频率是否符合要求
  10. 根据控制要求,定义并填充初始化结构体GPIO_InitStructure,向相应的结构体成员中写入适当的参数
  11. 调用初始化函数GPIO_Init()
  12. 编写相应的头文件led.h
  13. 针对不同应用,完成main.c
  14. 调试程序,总结。
  编写linux的驱动程序,所有驱动实质上都是向各种结构体成员写入适当的控制参数,填充好结构体。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分