流水燈相當(dāng)于計(jì)算機(jī)語言中的“Hello World”,照著做一遍,實(shí)現(xiàn)了它,基本你就入門了。
- STM32F103C8T6最小系統(tǒng)板的使用
- 面包板搭建流水燈電路的方法
- 將STM32F103RCT6工程模板修改為STM32F103C8T6的工程模板
- 熟悉STM32 單片機(jī)GPIO作為輸出的使用方法
根據(jù)STM32&STM8產(chǎn)品型號命名規(guī)則(參考:STM32單片機(jī)最小系統(tǒng)詳解)可知:STM32F103C8T6這個(gè)命名中:
- STM32代表STM32家族,32位MCU;
- F代表產(chǎn)品類型為基礎(chǔ)型;
- 103代表特定功能為STM32基礎(chǔ)型;
- C代表引腳數(shù)為48&49引腳;
- 8代表內(nèi)存容量為64KB;
- T代表封裝為QFP;
- 6代表溫度范圍為-40到+85℃。
通過原理圖我們可知:
- 板子供電有兩種方式:
- 通過U3 USB-micro接口提供5V供電,然后經(jīng)過板載的LDO芯片轉(zhuǎn)為VCC3V3;
- 通過P2 接口,即SWD下載接口中的VCC3V3給核心板供電。
- 核心板上有兩個(gè)LED,其中一個(gè)為電源指示燈PWR,另外一個(gè)LED與PC13引腳相連,當(dāng)PC13置高時(shí),LED滅;當(dāng)PC13置低時(shí),LED亮;
- 核心板上的跳線是為了選擇啟動模式使用。我們?yōu)榱俗尦绦蛞灾鏖W存存儲器作為啟動區(qū)域,需要將BOOT0置低,BOOT1隨意,此種啟動模式是最常用的用戶FLASH啟動,為默認(rèn)啟動模式;
- 核心板上的按鍵為RESET復(fù)位按鍵;
- P2接口為SWD下載模式對應(yīng)的引腳接口;
- 準(zhǔn)備元器件
注意:電阻使用的是2K,作為限流使用;LED注意正負(fù)極,直插發(fā)光二極管,引腳長的為正極,短的為負(fù)極;如果引腳被剪過了,一樣長了,查看發(fā)光二極管管體內(nèi)部金屬極大小,金屬極較小的是正極,大的片狀的是負(fù)極。
- 搭建電路按照如下原理圖搭建電路
搭建完畢效果圖
在基于STM32固件庫的MDK5工程建立基礎(chǔ)上,將STM32F103RCT6工程模板修改為STM32F103C8T6的工程模板。修改點(diǎn):
1. 替換啟動文件,將startup_stm32f10x_hd.s更換為startup_stm32f10x_md.s,startup_stm32f10x_md.s為中等容量產(chǎn)品使用的啟動文件,對應(yīng)FLASH的大小范圍為:64K≤FLASH≤128K。
2. 修改全局宏定義,將STM32F10X_HD修改為STM32F10X_MD。
3. 更改使用的芯片型號
4. 設(shè)置下載的Flash容量
注意:網(wǎng)上說STM32F103C8T6和STM32F103CBT6 是在同一圓晶上制造的,但測試時(shí),只測試手冊提供的參數(shù)范圍所包含的內(nèi)容,也就意味著 STM32F103C8T6也是128k Flash,只不過只測試了前面64k,然后打上 STM32F103C8T6標(biāo)注(當(dāng)然內(nèi)部就寫上 C8T6 的 ID);所以我們在添加Flash的時(shí)候,只能找到128K的STM32F103,而找不到64K的Flash。
1. 設(shè)置PA5、PA6、PA7為輸出
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
2. 初始化GPIO為高電平,高電平的時(shí)候,LED滅
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
3. 流水燈代碼具體實(shí)現(xiàn)
#include "stm32f10x.h"
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
Delay(1000000);Delay(1000000);Delay(1000000);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
Delay(1000000);Delay(1000000);Delay(1000000);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
GPIO_SetBits(GPIOA,GPIO_Pin_6);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
Delay(1000000);Delay(1000000);Delay(1000000);
}
}
歡迎關(guān)注
公眾號【嵌入式從0到1】專注于嵌入式知識分享,學(xué)習(xí)路上不迷路。
喜歡本文的話,收藏、點(diǎn)贊、分享、留言互動一下吧。