一些嵌入式的小心得(新手向)一

处理重复调用

有些头文件可能出现多次重复调用的情况:
解决方案——使用用户宏定义

#ifndef  _用户宏名称
#define _用户宏名称
#define  不希望被重复定义的用户定义
 ····
 #endif  

STM固件库常用文件

(参考野火哥的固件库分析)

  1. 汇编编写的启动文件
startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、调用C库函数_main
  1. 时钟配置文件
system_stm32f10x.c:把外部时钟HSE=8M,经过PLL倍频为72M。
  1. 外设相关的
stm32f10x.h:实现了内核之外的外设的寄存器映射
xxx:GPIO、USRAT、I2C、SPI、FSMC等驱动
stm32f10x_xx.c:外设的驱动函数库文件
stm32f10x_xx.h:存放外设的初始化结构体,外设初始化结构体成员的参数列表,外设固件库函数的声明
  1. 内核相关的
CMSIS - Cortex 微控制器软件接口标准
core_cm3.h:实现了内核里面外设的寄存器映射
core_cm3.c:内核外设的驱动固件库
NVIC(嵌套向量中断控制器)、SysTick(系统滴答定时器)
misc.h
misc.c
  1. 头文件的配置文件
stm32f10x_conf.h:头文件的头文件
//stm32f10x_usart.h
//stm32f10x_i2c.h
//stm32f10x_spi.h
//stm32f10x_adc.h
//stm32f10x_fsmc.h
  1. 专门存放中断服务函数的C文件
stm32f10x_it.c
stm32f10x_it.h

提升代码可读性——位带操作

把“位带地址+位序号”转换成别名地址的宏,以端口输入数据寄存器(GPIOx_IDR)为例
以端口输入数据寄存器为例定义宏为

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF)<<5)+(bitnum<<2))

其中 addr & 0xF0000000,取地址的高4位,看看是2还是4,用于区分SRAM和外设地址 :如果是2,+0x02000000则=0X2200 0000,即是SRAM,如果是4,+0x02000000则=0X4200 0000,即是外设

addr & 0x000FFFFFF,屏蔽掉高两位,相当于-0X2000 0000或者-0X4000 0000,结果表示偏移位带区多少个字节
<<5 等于x8x4,因为位带区一个地址表示一个字节,一个字节有8个bit,一个bit可以膨胀成一个字,即4个字节
<<2 等于x4,因为一个位可以膨胀成一个字,即4个字节
这样只要再把把位带别名区地址转换成指针即可实现对GPIO特定区数值进行直接访问而不用再去查找手册

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章