做招聘和求職都需要哪些網(wǎng)站站長(zhǎng)統(tǒng)計(jì)是什么意思
很多單片機(jī)都是高電平弱驅(qū)動(dòng),低電平強(qiáng)驅(qū)動(dòng),所以這里是低電平有效
點(diǎn)亮一個(gè)LED燈
操作STM32的GPIO需要三個(gè)操作:
第一個(gè)使用RCC開啟GPIO的時(shí)鐘
第二步使用GPIO_Init函數(shù)初始化GPIO
第三步使用輸出或輸入函數(shù)控制GPIO
1.使用RCC開啟GPIO的時(shí)鐘
1.1.RCC的庫(kù)函數(shù)
點(diǎn)擊
主要用到這三個(gè)函數(shù)
1126這個(gè)函數(shù):第一個(gè)參數(shù)選擇外設(shè),第二個(gè)參數(shù)使能或失能
示例 開啟GPIOA的時(shí)鐘
1.2.GPIO庫(kù)函數(shù):
還是Librayry里面
GPIO全部函數(shù)
349行函數(shù)調(diào)用之后,所指定的GPIO函數(shù)外設(shè)就會(huì)被復(fù)位,這個(gè)就是這個(gè)函數(shù)的用途
350行函數(shù),作用:復(fù)位AFIO外設(shè)
351行函數(shù),非常重要,這個(gè)函數(shù)的作用是用結(jié)構(gòu)體的參數(shù)來初始化GPIO口,我們需要先定義一個(gè)結(jié)構(gòu)體變量,再給結(jié)構(gòu)體賦值,最后調(diào)用這個(gè)函數(shù),這個(gè)函數(shù)內(nèi)部就會(huì)自動(dòng)讀取結(jié)構(gòu)體的值,然哈自動(dòng)把外設(shè)的各個(gè)參數(shù)配置好
352行函數(shù),這個(gè)函數(shù)可以把結(jié)構(gòu)體變量賦給一個(gè)默認(rèn)值
353-356這四個(gè)函數(shù)就是GPIO的讀取函數(shù)
357-360這四個(gè)就是GPIO的寫入函數(shù)
353-360這些函數(shù)就可以實(shí)現(xiàn)讀寫GPIO口的功能
361-366目前不用
這里面最重要的函數(shù)是:351,353-360
LED燈程序編寫:
2.1.首先調(diào)用RCC里面的APB2外設(shè)時(shí)鐘控制函數(shù)
因?yàn)橐c(diǎn)亮PA0口的LED,所以選擇RCC_APB2Periph GPIOA這一項(xiàng)
第二個(gè)參數(shù)選擇ENABLE,放到第二個(gè)參數(shù)
這樣時(shí)鐘就開啟了
2.2.然后調(diào)用GPIO_Init函數(shù)
第一個(gè)參數(shù)選擇GPIOA,第二個(gè)參數(shù)是一個(gè)結(jié)構(gòu)體
把結(jié)構(gòu)體定義出來
然后用點(diǎn)把結(jié)構(gòu)體的成員都定義出來
然后從8開始到10都是一個(gè)套路,右鍵跳轉(zhuǎn),看說明,復(fù)制粘貼一下參數(shù)
選擇這個(gè),Ctrl+F搜索一下,然后跳轉(zhuǎn)下圖
這里就是GPIO的八種工作模式
AIN是模擬輸入,IN_FLOATING是浮空輸入,IPD是下拉輸入,IPU是上拉輸入
OUT_PD是開漏輸出,OUT_PP是推挽輸出,AF_OD是復(fù)用開漏,AF_PP是復(fù)用推挽
點(diǎn)燈是推挽輸出,所以復(fù)制OUT_PP
推挽輸出:可以高電平也可以低電平
接下來GPIO_Pin選擇引腳,然后繼續(xù)右鍵跳轉(zhuǎn)
選擇menber
然后選擇這個(gè),Ctrl+F然后跳轉(zhuǎn)下圖
這里因?yàn)橛玫氖荊PIOA外設(shè)的0號(hào)引腳,所以選擇GPIO_Pin_0
這樣就設(shè)置好引腳了
然后設(shè)置第三個(gè),還是右鍵跳轉(zhuǎn)
Ctil+F搜索,跳轉(zhuǎn)下面頁(yè)面
輸出速度選50HZ就行
最后把GPIO初始化結(jié)構(gòu)體的地址放到GPIO_Init的第二個(gè)參數(shù)就行了,這樣GPIO初始化就完成了
當(dāng)這個(gè)GPIO_Inlt函數(shù)執(zhí)行完,這個(gè)GPIO外設(shè)的0號(hào)引腳就自動(dòng)被配置為推挽輸出,50HZ的速度了
它內(nèi)部的主要執(zhí)行邏輯就是讀取結(jié)構(gòu)體的參數(shù),執(zhí)行一堆判斷和運(yùn)算,最后寫入到GPIO的配置寄存器
上面步驟已經(jīng)把GPIO初始化完成,下面就可以使用輸入輸出函數(shù)了
輸出函數(shù)介紹
2.3.這次試驗(yàn)就用這四個(gè)輸出函數(shù)
GPIO_Setbits:
第一個(gè)參數(shù)是GPIOx,也就是設(shè)置IO口,例如如果是PA那就是GPIOA,第二個(gè)參數(shù)是GPIO_Pin,這個(gè)函數(shù)可以把指定的端口設(shè)置為高電平
GPIO_ResetBits:
第一個(gè)參數(shù)是GPIOx,也就是設(shè)置IO口,例如如果是PA那就是GPIOA,第二個(gè)參數(shù)是GPIO_Pin,這個(gè)函數(shù)可以把指定的端口設(shè)置為低電平
GPIO_Writebit:
這個(gè)函數(shù)有三個(gè)參數(shù),前兩個(gè)跟上面一樣,第三個(gè)是BitValue,這個(gè)是根據(jù)第三個(gè)參數(shù)的值來設(shè)置指定的端口
GPIO_Write
第一個(gè)參數(shù)是GPIOx,也就是設(shè)置IO口,第二個(gè)參數(shù)是PortVal,這個(gè)函數(shù)可以同時(shí)對(duì)16個(gè)端口進(jìn)行寫入操作
開始實(shí)踐
用一下第一個(gè)函數(shù)
看注釋
第一個(gè)GPIOx,x可以是A到G
第二個(gè)GPIO_Pin_x,x可以是0到15
這樣就是控制了PA0
這個(gè)函數(shù)是把指定端口設(shè)置低電平,所以燈亮了
再來試試這個(gè)函數(shù)
這個(gè)函數(shù)是把指定端口設(shè)置高電平,所以燈滅了
然后再來試試第三個(gè)函數(shù)
第三個(gè)參數(shù)介紹的是指定寫入的數(shù)據(jù)值,這個(gè)參數(shù)可以是BitAction這個(gè)枚舉中的一個(gè)值
Bit_RESET是清除端口值,也就是置低電平
Bit_SET是設(shè)置端口值,也就是置高電平
寫B(tài)it_RESET
燈又亮了
寫Bit_SET
燈又滅了
這就是這三個(gè)函數(shù)的用法
流水燈實(shí)驗(yàn)
還是之前LED的文件,復(fù)制粘貼一下
流水燈是用GPIOA的0-7號(hào)端口,所以這里要加端口1-7,在GPIO_Pin_0后面或運(yùn)算GPIO_Pin_1或運(yùn)算GPIO_Pin_2,這樣就可以一次性把三個(gè)端口一次性都初始化了
為什么可以這樣呢,我們看這個(gè),這里可以看到,Pin0對(duì)應(yīng)的是0x0001
這個(gè)是二進(jìn)制形式
以此類推,每個(gè)端口對(duì)應(yīng)一個(gè)位,如果把它們進(jìn)行按位或的操作,這就是按位或的操作邏輯
比如Pin0,Pin1,Pin2按位或,結(jié)果就是0111,這樣就相當(dāng)于同時(shí)選中了三個(gè)端口
這里還有一個(gè)這個(gè)函數(shù),GPIO_Pin_All,它對(duì)應(yīng)的數(shù)據(jù)就是0xFFFF,也就是所有位都為1,這樣就相當(dāng)于選中了所有的引腳
時(shí)鐘控制這一項(xiàng),也是可以利用按位或的操作方式來選擇多個(gè)外設(shè)的,數(shù)據(jù)規(guī)律是每一位對(duì)應(yīng)一個(gè)外設(shè)
這個(gè)也可以利用按位或選擇多個(gè)引腳,所以Setbit+了個(gè)s
這個(gè)函數(shù)也是一樣的意思
這里的話就直接用GPIO_Pin_Alll了,這樣就把16個(gè)端口全部配置為了推挽輸出模式
為了現(xiàn)在同時(shí)控制16個(gè)端口,我們就可以使用GPIO_Write這個(gè)函數(shù)了
GPIO_Write
第一個(gè)參數(shù)是GPIOx
跳轉(zhuǎn)看看,這里寫的是,指定寫到輸出數(shù)據(jù)寄存器的值
可以看到,這第二個(gè)參數(shù)就是直接寫道GPIO的ODR寄存器里面的
所以直接寫0x0001,因?yàn)閏語(yǔ)言不支持寫二進(jìn)制,所以這里只能寫十六進(jìn)制
最低位對(duì)應(yīng)PA0,然后往上依次是PA1,PA2
一直到PA15
因?yàn)槭堑碗娖近c(diǎn)亮,所以要在前面再加按位取反的符號(hào)