日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32的学习记录--1.准备工作

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32的学习记录--1.准备工作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

本次學習用的單片機是STM32F103C8T6
本博客僅用于課余學習,不可商用!!
如有侵權,請告知我刪除博客,謝謝配合。
以下學習資料均在云盤,僅供學習交流 禁止用于商業用途

資料下載:

鏈接:https://pan.baidu.com/s/1b4KDuO0hU1rUvXRbo4QRlg
提取碼:Lin2

本文鏈接

個人博客:https://ronglin.fun/archives/64
PDF鏈接:見博客網站
CSDN: https://blog.csdn.net/RongLin02/article/details/103780913

一.STM32的入門學習

1.安裝Keil uVision5過程

a.安裝mdk_514.exe
b.安裝Keil.STM32F4xx_DFP.1.0.8.pack
c.潑姐
d.安裝ST-LINK驅動
注意事項
1.整個過程按照說明書《STM32軟件開發指南》進行。
2.安裝過程中安裝目錄根目錄必須是是全英文。
3.潑姐的時候要賦予Keil uVision5管理員權限。
4.win10系統要安裝ST-LINK V2 WIN10 驅動。

2.簡單程序的燒錄

a.下載STM32Demo文件壓縮包并解壓。
b.打開Keil uVision5.exe導入項目。
c.導入項目后對整個項目進行rebuild(整個項目編譯)和build(編譯F7)。
d.插上單片機之后,點擊download將程序燒入單片機。
注意事項
1.導入過程:project–open project–在根文件\STM32Demo\STM32Demo\MDK-ARM找到Project.uvprojx文件導入。
2.在Keil uVision5項目文件中最后一個文件是暫時不存在的,需要刪除。
3.rebuild之后部分電腦中core_cm3.o文件會消失,在rebuild編譯完之后將壓縮包里的core_cm3.o復制到\STM32Demo\STM32Demo\MDK-ARM\STM3210B-EVAL文件夾下。
4.單片機的燒錄工具要每一個針腳都對應好,插正確。

3.簡單點亮LED燈

a.學會使用高電平GPIO_SetBits(GPIOB,GPIO_Pin_3)語句
b.學會使用低電平GPIO_ResetBits(GPIOB,GPIO_Pin_3)語句
c.學會使用代碼打開和初始化led接口
d.學會用延遲來讓實現跑馬燈模式
C語言源代碼:

#include <string.h> #include <stdio.h> #include "port.h" void delay(); int main(void) { //聲明一個結構體變量,變量名字是GPIO_InitStructure,結構體的原型由GPIO_InitTypeDef 確定GPIO_InitTypeDef GPIO_InitStructure; // Enable GPIOs clocks (打開端口B和時鐘AFIO,類似總開關的東西,只有開啟了才能調用這個端口)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //將默認配置為JTAG調試功能的關閉,變成普通的燈(GPIO_Remap_SWJ_JTAGDisable , ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //初始化GPIO_Pin_3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最高輸出速率50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); /*GPIOB的意思GPIO的外設口B, &GPIO_InitStructure”指向結構GPIO_InitTypeDef的指針,包含了外設GPIO的配置信息*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);while(1)//死循環{GPIO_SetBits(GPIOB,GPIO_Pin_3);//設置高電平,燈亮delay();GPIO_ResetBits(GPIOB,GPIO_Pin_3);//設置低電平,燈滅delay();GPIO_SetBits(GPIOB,GPIO_Pin_8);delay();GPIO_ResetBits(GPIOB,GPIO_Pin_8);delay();GPIO_SetBits(GPIOB,GPIO_Pin_9);delay();GPIO_ResetBits(GPIOB,GPIO_Pin_9);delay();} } void delay()//延時函數 {int delay1=0x2FF;//十六進制int delay2=0xFF;//十六進制while(delay1--){ delay2=0xFF;while(delay2--);} }

4.用開關控制LED燈

a.學會使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)判斷開關狀態
b.學會使用代碼打開和初始化開關引腳
c.當開關按下時,GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)的值等于0
d.用狀態值來存儲按下的不同開關
e.用計數器來實現跑馬燈

實現功能
key1:打開所有燈;
key2:關閉所有燈;
key3:從左到右跑馬燈;
key4:從右到左跑馬燈;
key5:對稱跑馬燈;

C語言源代碼:

#include <string.h> #include <stdio.h> #include "port.h" void close(); void open(); void run(int sum); void mirror(int sum); int main(void) {int staute;//存儲狀態值int sum=0;//跑馬燈計數器GPIO_InitTypeDef GPIO_InitStructure;//定義結構體變量 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);//打開端口B RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//打開端口A RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//打開時鐘AFIO GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//關閉調試功能,將燈變為普通燈 {//打開所有燈的引腳 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_5);//5;(將燈的初始狀態設置為關閉狀態,下同)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_3);//7GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_4);//6GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_6);//4GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_8);//2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_7);//3GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_9);//1GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_15);//8 } {//打開所有開關的引腳 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入,下同 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//KEY1GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY5GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY3GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY4 }while(1) { {//判斷按下了哪個開關 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0) {staute=1;sum=0;} if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==0) {staute=2;sum=0;} if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==0) staute=3; if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0) staute=4; if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==0) {staute=5;sum=0;} } if(sum>80000) sum=0;//重置計數器,從左到右 if(sum<0) sum=80000;//重置計數器,從右到左 switch (staute)//根據狀態值執行操作{case 1: open();break;//打開所有燈case 2: close();break;//關閉所有燈case 3: {sum++;run(sum);}break;//從左到右跑馬燈case 4: {sum--;run(sum);}break;//從右到左跑馬燈case 5: {if(sum==40000) sum=0;sum++;mirror(sum);}break;//對稱跑馬燈default: close();break;//如有錯誤,關閉所有燈} } } void close()//關閉所有燈 { GPIO_ResetBits(GPIOA,GPIO_Pin_15); GPIO_ResetBits(GPIOB,GPIO_Pin_3); GPIO_ResetBits(GPIOB,GPIO_Pin_4); GPIO_ResetBits(GPIOB,GPIO_Pin_5); GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_7); GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9); } void open()//打開所有燈 { GPIO_SetBits(GPIOA,GPIO_Pin_15); GPIO_SetBits(GPIOB,GPIO_Pin_3); GPIO_SetBits(GPIOB,GPIO_Pin_4); GPIO_SetBits(GPIOB,GPIO_Pin_5); GPIO_SetBits(GPIOB,GPIO_Pin_6); GPIO_SetBits(GPIOB,GPIO_Pin_7); GPIO_SetBits(GPIOB,GPIO_Pin_8); GPIO_SetBits(GPIOB,GPIO_Pin_9); } void run(int sum)//跑馬燈 { if(sum>=0&&sum<=10000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_9);}//全滅,1燈亮 else if(sum>10000&&sum<=20000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_8);}//全滅,2燈亮 else if(sum>20000&&sum<=30000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_7);}//全滅,3燈亮 else if(sum>30000&&sum<=40000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_6);}//全滅,4燈亮 else if(sum>40000&&sum<=50000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_5);}//全滅,5燈亮 else if(sum>50000&&sum<=60000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_4);}//全滅,6燈亮 else if(sum>60000&&sum<=70000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_3);}//全滅,7燈亮 else if(sum>70000&&sum<=80000) {close();GPIO_SetBits(GPIOA,GPIO_Pin_15);}//全滅,8燈亮 else close(); } void mirror(int sum)//對稱跑馬燈 { if(sum>=0&&sum<=10000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_9);GPIO_SetBits(GPIOA,GPIO_Pin_15);} else if(sum>10000&&sum<=20000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_8);GPIO_SetBits(GPIOB,GPIO_Pin_3);} else if(sum>20000&&sum<=30000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_7);GPIO_SetBits(GPIOB,GPIO_Pin_4);} else if(sum>30000&&sum<=40000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_6);GPIO_SetBits(GPIOB,GPIO_Pin_5);} else close(); }

對于STM32中的GPIO_Mode–GPIO配置可以查閱資料
https://blog.csdn.net/RongLin02/article/details/103787777

總結

以上是生活随笔為你收集整理的STM32的学习记录--1.准备工作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。