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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【stm32入门】第二天环境搭建、RCC时钟、GPIO、闪烁实验与有源蜂鸣器实验

發布時間:2024/3/12 编程问答 77 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【stm32入门】第二天环境搭建、RCC时钟、GPIO、闪烁实验与有源蜂鸣器实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習參考:STM32入門教程-2022持續更新中_江科大自化協P3-1~3-3
這兩天學的稀里糊涂,這里看一點那里看一點,最后什么也沒搞明白,為了電賽凈選件但卻發現最基礎的32還沒搞太懂,今天難得清閑,把視頻重新看了一遍,覺得收獲頗豐,遂開始重新記錄筆記。
今日收獲:LED閃爍實驗、有源蜂鳴器實驗
電賽倒計17天

  • 開始之前

基礎部分全部看完才發現stm32并沒有我想象的難,其實流程上和arduino都是一樣的,只是自己需要配置的東西變多了,需要很詳細的初始化和 使用,而不像arduino那樣只需要簡單的初始化,但是這也是arduino的弊病,如果想要更改默認的參數會讓你感到很迷糊,這可能是stm32做的好的地方。
代碼的基礎流程:開啟時鐘👉初始化引腳👉在死循環使用引腳

在平衡車的教學中,范學長直接把各個元件的初始化都包裝到其他C文件和.h文件中,修改定義也要到那里去修改,這可能讓老手很方便操作和修改,但是讓剛入門的我在跳來跳去的過程中感到迷茫,在👆面的教程中,基本上所有代碼都是在main函數中寫出的,可能不是那么方便管理,但是讓我感受到arduino書寫代碼時候的熟悉感,一種莫名的熟悉感,希望它能幫助我學的更快吧。

第二天環境搭建與GPIO

  • 一、配置環境P3-1
  • 二、復位和時鐘設置(RCC)
  • 三、通用輸入/輸出(GPIO)
    • 1. GPIO_Init
    • 2. 函數GPIO_SetBits與GPIO_ResetBits
    • 3. 函數GPIO_WriteBit
    • 4. 函數GPIO_Write
  • 4. C語言基礎補齊(宏定義、數據類型、typedef結構體、枚舉)
    • 4.1 宏定義
    • 4.2 數據類型
    • 4.3 typedef
    • 4.4 結構體
    • 4.5 枚舉

一、配置環境P3-1

方法1:直接復制已經建立好的環境
方法2:利用stm32f10x的庫函數從頭創立👇
3-1視頻,提供參考

  • 建立工程文件夾,Keil中新建工程,選擇型號
  • 工程文件夾里建立Start、Library、User等文件夾,復制固件庫里面的文件到工程文件夾
  • 工程里對應建立Start、Library、User等同名稱的分組,然后將文件夾內的文件添加到工程分組里
  • 工程選項,C/C++,Include Paths內聲明所有包含頭文件的文件夾
  • 工程選項,C/C++,Define內定義USE_STDPERIPH_DRIVER
  • 工程選項,Debug,下拉列表選擇對應調試器,Settings,Flash Download里勾選Reset and Run

二、復位和時鐘設置(RCC)

參考數據手冊:STM32F103xx固件函數庫用戶手冊

//常見使用的語句 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 常用的3個函數名描述
RCC_AHBPeriphClockCmd使能或者失能 AHB 外設時鐘
RCC_APB2PeriphClockCmd使能或者失能 AHB2 外設時鐘
RCC_APB1PeriphClockCmd使能或者失能 AHB1 外設時鐘

3個函數的使用方法是一樣的

函數名RCC_AHB2PeriphClockCmd
功能描述使能或者失能 AHB 外設時鐘
輸入參數 1RCC_AHB2Periph: 門控 AHB 外設時鐘
功能描述NewState:指定外設時鐘的新狀態 。這個參數可以取:ENABLE 或者 DISABLE
輸出參數
返回值
先決條件
被調用函數

Table 373.RCC_AHB2Periph 值

RCC_AHB2Periph描述
RCC_APB2Periph_AFIO功能復用 IO 時鐘
RCC_APB2Periph_GPIOAGPIOA 時鐘
RCC_APB2Periph_GPIOBGPIOB時鐘
RCC_APB2Periph_TIM1TIM1 時鐘
RCC_APB2Periph_SPI1SPI1 時鐘

省略了好多值,用到了再查吧
當某個庫函數需要被調用函數為時鐘函數時,把他使能就好了,大部分的都需要

三、通用輸入/輸出(GPIO)

GPIO 庫函數常用的篩選

函數名描述
GPIO_Init根據 GPIO_InitStruct 中指定的參數初始化外設 GPIOx 寄存器
GPIO_StructInit把 GPIO_InitStruct 中的每一個參數按缺省值填入
GPIO_ReadInputDataBit讀取指定端口管腳的輸入
GPIO_ReadInputData讀取指定的 GPIO 端口輸入
GPIO_ReadOutputDataBit讀取指定端口管腳的輸出
GPIO_ReadOutputData讀取指定的 GPIO 端口輸出
GPIO_SetBits設置指定的數據端口位
GPIO_ResetBitsits 清除指定的數據端口位
GPIO_WriteBit設置或者清除指定的數據端口位
GPIO_Write向指定 GPIO 數據端口寫入數據
GPIO_PinRemapConfig改變指定管腳的映射(復用其他功能)
GPIO_EXTILineConfig選擇 GPIO 管腳用作外部中斷線路
具體使用方法參考庫函數,只說幾個用到的

1. GPIO_Init

函數名GPIO_Init
功能描述根據 GPIO_InitStruct 中指定的參數初始化外設 GPIOx 寄存器
輸入參數 1GPIOx:x 可以是 A,B,C,D 或者 E,來選擇 GPIO 外設
輸入參數 2GPIO_InitStruct:指向結構 GPIO_InitTypeDef 的指針,包含了外設 GPIO 的配置信息
輸出參數
返回值
先決條件
被調用函數
typedef struct { u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; } GPIO_InitTypeDef;
  • 其中,GPIO_Pin包含16個管腳,從0~15,所以可以這么設置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//一般情況下↓全選GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  • GPIO_Speed有三個值可以選擇,10MHz,2MHz,50MHz,使用如下
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO_Speed_10MHz,GPIO_Speed_2MHz,GPIO_Speed_50MHz
  • GPIO_Mode可以設置引腳的工作狀態,共有8種
GPIO_Speed描述
GPIO_Mode_AIN模擬輸入
GPIO_Mode_IN_FLOATING浮空輸入
GPIO_Mode_IPD下拉輸入
GPIO_Mode_IPU上拉輸入
GPIO_Mode_Out_OD開漏輸出
GPIO_Mode_Out_PP推挽輸出
GPIO_Mode_AF_OD復用開漏輸出
GPIO_Mode_AF_PP復用推挽輸出

一般來說,輸出設置推挽輸出即可,
推挽輸出高電平低電平都有供應能力
開漏輸出高電平處于高阻抗狀態沒有供電能力,低電平有供電能力
綜上,GPIO的初始化代碼一般為:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//開啟GPIOA的時鐘GPIO_InitTypeDef GPIO_InitStructure;//創建一個GPIO_InitTypeDef 類型的結構體GPIO_InitStructure,初始化所有值GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//選擇推挽輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//使能全部GPIOA的16個引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//頻率設置為50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);//初始化

2. 函數GPIO_SetBits與GPIO_ResetBits

GPIO_SetBits是設置數據的端口位,高電平,GPIO_ResetBits是清除數據的端口位,低電平

參數1參數2
GPIOx:x 可以是 A,B,C,D 或者 E,來選擇 GPIO 外設GPIO_Pin

3. 函數GPIO_WriteBit

GPIO_WriteBit是設置或清除數據的端口位,增加了一個參數,相當于聚合了👆面的兩個

參數1參數2參數3
GPIOx:x 可以是 A,B,C,D 或者 E,來選擇 GPIO 外設GPIO_Pin該參數必須取枚舉 BitAction 的其中一個Bit_RESET;Bit_SET:
所以
//這兩行語句是完全等價的GPIO_ResetBits(GPIOA, GPIO_Pin_0);Delay_ms(500);GPIO_SetBits(GPIOA, GPIO_Pin_0);Delay_ms(500);GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);Delay_ms(500);

4. 函數GPIO_Write


做流水燈的代碼里用過,如下👇

while (1){//端口數據寄存器是一個16位的數,每一位都對應著一個端口(IO口)//~是因為這里采用的是低電平的時候等才能亮,所以要取反GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001Delay_ms(100);GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010Delay_ms(100);GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100Delay_ms(100); //也可以采用一行語句,效果是一樣的GPIO_Write(GPIOA, ~0x0001|~0x0002|~0x0004); //0000 0000 0000 0111Delay_ms(100); }

4. C語言基礎補齊(宏定義、數據類型、typedef結構體、枚舉)

STM32入門教程-2022持續更新中_江科大自化協 P3-3
講的非常明白,但一會兒就去吃飯了,簡單寫寫

4.1 宏定義

簡單的說,就是取了個外號,常用經常修改的參數,如果用數字來寫的話,每次修改都需要頻繁的查找,如果用字符串在前面定義這個參數,那就只需要改動一次就行,并且字符串也更能增加函數的可讀性,如

define Speed 100 //定義Speed這個單詞和100等價

4.2 數據類型

4.3 typedef

引用課程的ppt👇
關鍵字:typedef
用途:將一個比較長的變量類型名換個名字,便于使用
定義typedef:

typedef unsigned char uint8_t;

引用typedef:

uint8_t a; //等效于unsigned char a;

4.4 結構體

類比數組,這是一個可以涵蓋多種數據格式的新格式
關鍵字:struct
用途:數據打包,不同類型變量的集合
定義結構體變量:

struct{char x; int y; float z;} StructName;

因為結構體變量類型較長,所以通常用typedef更改變量類型名
引用結構體成員:

StructName.x = 'A';StructName.y = 66;StructName.z = 1.23;

pStructName->x = 'A'; //pStructName為結構體的地址 pStructName->y = 66; pStructName->z = 1.23;*

4.5 枚舉

關鍵字:enum
用途:定義一個取值受限制的整型變量,用于限制變量取值范圍;也被可以認為是宏定義的集合,如果賦給某種枚舉類型變量的值不在限制里,會有warning
定義枚舉變量:

enum{FALSE = 0, TRUE = 1} EnumName;

因為枚舉變量類型較長,所以通常用typedef更改變量類型名
引用枚舉成員:

EnumName = FALSE; EnumName = TRUE;

總結

以上是生活随笔為你收集整理的【stm32入门】第二天环境搭建、RCC时钟、GPIO、闪烁实验与有源蜂鸣器实验的全部內容,希望文章能夠幫你解決所遇到的問題。

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