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

處理重複調用

有些頭文件可能出現多次重複調用的情況:
解決方案——使用用戶宏定義

#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特定區數值進行直接訪問而不用再去查找手冊

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