F103筆記(正點原子資料) 1 11

2021-10-14 11:21:07 字數 2978 閱讀 5637

比較稀碎哈哈 再學一編32基礎操作

io在zet6裡面查詢有ft標識的可以接5v

浮空,顧名思義就是浮在空中,上面用繩子一拉就上去了,下面用繩子一拉就沉下去了. 

開漏,就等於輸出口接了個npn三極體,並且只接了e,b. c極 是開路的,你可以接乙個電阻到3.3v,也可以接乙個電阻到5v,這樣,在輸出1的時候,就可以是5v電壓,也可以是3.3v電壓了.但是不接電阻上拉的時候,這個輸出高就不能實現了. 

推挽,就是有推有拉,任何時候io口的電平都是確定的,不需要外接上拉或者下拉電阻.

(從開源電子網抄的)

gpio_mode_ipu 上拉輸入

gpio_mode_ipd 下拉輸入

gpio_mode_out_od 開漏輸出

gpio_mode_out_pp 推挽輸出

gpio_mode_af_od 復用開漏輸出

gpio_mode_af_pp 復用推挽輸出

跑馬燈1) 使能 io 口時鐘。呼叫函式為 rcc_apb2periphclockcmd()。

2) 初始化 io 引數。呼叫函式 gpio_init();

3) 操作 io。

mdk:

stm32f10x_it.c定義中斷服務函式

system_stm32f10x.c定義時鐘初始化函式

system是常用的公共** 包含延時函式 io口位操作 串列埠函式

core韌體庫核心檔案和啟動檔案

fwlib st官方的外設韌體庫

組 hardware 下面存放的是每個實驗的外設驅動** 比如 led.c 裡面呼叫 stm32f10x_gpio.c 裡面的函式對 led 進行 初始化

user組:main.c檔案使用者**呼叫hardware組下面的裝置驅動**以 及直接操作fwlib下 面的韌體庫函式。

hardware組:***.c/***.**件 裝置初始化**直接操作fwlib下面的韌體庫函式實現。alientek提供。

fwlib組:stm32f10x_ppp.c stm32f10x_ppp.h 韌體庫驅動** 直接操作暫存器實現

間接操作暫存器

記住幾 個常用的配置,比如 0x0 表示模擬輸入模式(adc 用)、0x3 表示推挽輸出模式(做輸出口用, 50m 速率)、0x8 表示上/下拉輸入模式(做輸入口用)、0xb 表示復用輸出(使用 io 口的第二 功能,50m 速率)。

gpio 相關的函式和定義分布在韌體庫檔案 stm32f10x_gpio.c 和標頭檔案 stm32f10x_gpio.h 文 件中。

重要函式

1.void gpio_init(gpio_typedef* gpiox, gpio_inittypedef* gpio_initstruct);io口初始化函式

gpio_inittypedef gpio_initstructure;

gpio_initstructure.gpio_pin = gpio_pin_5; //led0-->pb.5 推挽輸出

gpio_initstructure.gpio_mode = gpio_mode_out_pp; //推挽輸出

gpio_initstructure.gpio_speed = gpio_speed_50mhz;

gpio_init(gpiob, &gpio_initstructure);

第二個引數為初始化引數結構體指標,結構體型別為 gpio_inittypedef。需要在前面定義這個結構體,再分別初始化元素

2.uint8_t gpio_readinputdatabit(gpio_typedef* gpiox, uint16_t gpio_pin); 讀取io口資料

比如我要讀 gpioa.5 的電平狀態,那麼方法是:gpio_readinputdatabit(gpioa, gpio_pin_5); 返回值是 1(bit_set)或者 0(bit_reset);、

3.void gpio_setbits(gpio_typedef* gpiox, uint16_t gpio_pin);

void gpio_resetbits(gpio_typedef* gpiox, uint16_t gpio_pin)

在多數情況下,我們都是採用這兩個函式來設定 gpio 埠的輸入和輸出狀態。比如我們要設 置 gpiob.5 輸出 1,那麼方法為: gpio_setbits(gpiob, gpio_pin_5);

反之如果要設定 gpiob.5 輸出位 0,方法為: gpio_resetbits (gpiob, gpio_pin_5);

led一端連線電源 一端連線io口 低電平亮 使用推挽輸出高低電平控制亮滅

4.void rcc_apb2periphclockcmd(uint32_t rcc_apb2periph, functionalstate newstate) 使能時鐘

核心led.h 巨集定義

#define led0 pbout(5)// ds0

#define led1 peout(5)// ds1

通過位帶操作 pb5 輸出高低電平從而控制 led0 的方法如下

led0=1; //通過位帶操作控制 led0 的引腳 pb5 輸出高電平

led0=0; //通過位帶操作控制 led0 的引腳 pb5 輸出低電平

在配置 stm32 外設的時候,任何時候都要先使能該 外設的時鐘。gpio 是掛載在 apb2 匯流排上的外設,在韌體庫中對掛載在 apb2 匯流排上的外設時 鐘使能是通過函式 rcc_apb2periphclockcmd()來實現的。

led.c 

rcc_apb2periphclockcmd(rcc_apb2periph_gpiob|rcc_apb2periph_gpioe,enable);
#include "led.h"

#include "delay.h"

#include "sys.h"

int main(void)

}

main函式如下

正點原子STM32F103精英版學習筆記(二)

st link 和stm32f103都支援jtag 和swd,用jtag除錯時占用的io線比較多,swd除錯時占用的比較少,只需要2根即可。而且相對來說,大資料下swd工作方式引導程式失敗的可能性很小。注 jtag 和swd是 器除錯armcpu的兩種工作方式。可參考 jtag jlink swd ...

《深入理解C 11》筆記 原子型別和原子操作

原子操作就是在多執行緒程式中 最小的且不可並行化的 操作,意味著多個執行緒訪問同乙個資源時,有且僅有乙個執行緒能對資源進行操作。通常情況下原子操作可以通過互斥的訪問方式來保證,例如linux下的互斥鎖,windows下的臨界區等。下面讓我們看個例子 long long total 0 void fu...

正點原子戰艦v3筆記(0)GPIO暫存器配置介紹

gpioa 下有十六個 口 從pa0 pa15 每組gpio口都有7個暫存器 如果你的裝置有 7 組gpio口 那麼暫存器就有,7 7 49個暫存器,比如 gpioa 有16個gpio 那就是由這7個暫存器進行控制 gpiox crl 埠配置低暫存器 模式配置 配置 0 7 io口的模式和速度 gp...