文章目錄
- 一、學習任務
- 二、學習內容
- 1.基于暫存器與基于韌體庫的stm32 LED流水燈編程方式差異
- 1.1基于暫存器的stm32 LED流水燈程式
- 1.1.1暫存器簡介
- 1.1.2.代碼
- 1.2基于韌體庫的stm32 LED流水燈程式
- 1.2.1韌體庫概述
- 1.2.2代碼
- 1.3 差異
- 2.STM32的USART視窗通訊程式
- 2.1 實驗環境
- 2.2 實驗檔案
- 2.3.相關代碼及修改
- 2.4.燒錄程式
- 3.實驗結果
- 三、參考網址
一、學習任務
- 學習相關資料,說名基于暫存器與基于韌體庫的stm32 LED流水燈例子的編程方式有什么差異,
- 學習和閱讀“零死角玩轉STM32F103–指南者”檔案中的第20、21章內容,完成STM32的USART視窗通訊程式,要求:1)設定波特率為115200,1位停止位,無校驗位,2)STM32系統給上位機(win10)連續發送“hello windows!”,上位機接收程式可以使用“串口除錯助手“,也可自己編程,3)當上位機給stm32發送“Stop,stm32”后,stm32停止發送,
二、學習內容
1.基于暫存器與基于韌體庫的stm32 LED流水燈編程方式差異
1.1基于暫存器的stm32 LED流水燈程式
1.1.1暫存器簡介
暫存器的功能是存盤二進制代碼,它是由具有存盤功能的觸發器組合起來構成的,一個觸發器可以存盤1位二進制代碼,故存放n位二進制代碼的暫存器,需用n個觸發器來構成,
按照功能的不同,可將暫存器分為基本暫存器和移位暫存器兩大類,基本暫存器只能并行送入資料,也只能并行輸出,移位暫存器中的資料可以在移位脈沖作用下依次逐位右移或左移,資料既可以并行輸入、并行輸出,也可以串行輸入、串行輸出,還可以并行輸入、串行輸出,或串行輸入、并行輸出,十分靈活,用途也很廣,
1.1.2.代碼
led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED埠定義
#define LED0 PBout(5) // DS0
#define LED1 PEout(5) // DS1
void LED_Init(void); //初始化
#endif
led.c
#include "led.h"
//初始化PB5和PE5為輸出口.并使能這兩個口的時鐘
//LED IO初始化
void LED_Init(void)
{
RCC->APB2ENR|=1<<3; //使能PORTB時鐘
RCC->APB2ENR|=1<<6; //使能PORTE時鐘
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;//PB.5 推挽輸出
GPIOB->ODR|=1<<5; //PB.5 輸出高
GPIOE->CRL&=0XFF0FFFFF;
GPIOE->CRL|=0X00300000;//PE.5推挽輸出
GPIOE->ODR|=1<<5; //PE.5輸出高
}
main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
int main(void)
{
Stm32_Clock_Init(9);//系統時鐘設定
delay_init(72); //延時初始化
LED_Init(); //初始化與LED連接的硬體介面
while(1)
{
LED0=0; //低電平有效
LED1=1;
delay_ms(1000);
LED0=1;
LED1=0;
delay_ms(1000);
}
}
1.2基于韌體庫的stm32 LED流水燈程式
1.2.1韌體庫概述
韌體是介于軟體和硬體之間的產品,給開發者訪問底層硬體提供一個中間的API,大大提高應用程式開發效率,CMSIS: ARM Cortex? 微控制器軟體介面標準(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 處理器系列的與供應商無關的硬體抽象層,使用CMSIS,可以為處理器和外設實作一致且簡單的軟體介面,從而簡化軟體的重用、縮短微控制器新開發人員的學習程序,并縮短新設備的上市時間,
1.2.2代碼
led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5
void LED_Init(void);//初始化
#endif
led.c
#include "led.h"
//初始化PB5和PE5為輸出口.并使能這兩個口的時鐘
//LED IO初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE埠時鐘
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; //IO口速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定引數初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 輸出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 埠配置, 推挽輸出
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽輸出 ,IO口速度為50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 輸出高
}
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
int main(void)
{
delay_init(); //延時函式初始化
LED_Init(); //初始化與LED連接的硬體介面
while(1)
{
LED0=0;
LED1=1;
delay_ms(300); //延時300ms
LED0=1;
LED1=0;
delay_ms(300); //延時300ms
}
}
/**
*****************下面注視的代碼是通過呼叫庫函式來實作IO控制的方法*****************************************
int main(void)
{
delay_init(); //初始化延時函式
LED_Init(); //初始化LED埠
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED0對應引腳GPIOB.5拉低,亮 等同LED0=0;
GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED1對應引腳GPIOE.5拉高,滅 等同LED1=1;
delay_ms(300); //延時300ms
GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0對應引腳GPIOB.5拉高,滅 等同LED0=1;
GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1對應引腳GPIOE.5拉低,亮 等同LED1=0;
delay_ms(300); //延時300ms
}
}
1.3 差異
仔細觀察源代碼發現主要是led.c中的LED_Init()函式有很大的差別,基于暫存器的主要是使用指標指向地址進行使能和賦值;基于韌體庫主要使用的函式包進行使能和賦值,在小工程中可以看出使用暫存器和韌體庫是沒有多大差別的,但從實作多功能和多埠的工程設計來看,使用韌體庫可以大大減少開發時間,提高作業效率,
使用韌體庫,目前比較多的例程是使用韌體庫撰寫的,官方的例子也都采用韌體庫方式,特點就是簡單,易于理解,資料多,如果你沒有CortexM系列內核的開發基礎,建議從韌體庫開始玩起,等有一定基礎,或是特別需要時再用暫存器,
使用暫存器,想要深入理解CortexM3內核或是需要為了獲得更好的可移植性,學習暫存器編程會比較有幫助,但是從專業的角度上看,暫存器更貼近底層,對外設的作業原理和運行機理會有更深的理解,
2.STM32的USART視窗通訊程式
2.1 實驗環境
開發板:野火指南者(STM32F103)
STM32庫版本:STM32F10x_StdPeriph_Lib_V3.5.0
IDE:KEIL5
使用到的串口:USART1
硬體原理圖:

2.2 實驗檔案
鏈接:書籍配套例程-F103VE指南者
提取碼:k5rw
下載完成后如箭頭所示打開keil檔案,

2.3.相關代碼及修改
2.3.1 找到stm32f10x_it.c,及main.c;

2.3.2 代碼
stm32f10x_it.c:
int i=0;
uint8_t ucTemp[50];
void DEBUG_USART_IRQHandler(void)
{
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
{
ucTemp[i] = USART_ReceiveData(USART1);
}
if(ucTemp[i] == '!')
{
if(ucTemp[i-1] == '2'&&ucTemp[i-2] == '3'&&ucTemp[i-3] == 'm'&&ucTemp[i-4] == 't'&&ucTemp[i-5] == 's'&&ucTemp[i-6] == ' ')
if(ucTemp[i-7] == 'p'&&ucTemp[i-8] == 'o'&&ucTemp[i-9] == 't'&&ucTemp[i-10] == 's')
{
printf("收 到!");
while(1);
}
}
i++;
}
main.c:
#include "stm32f10x.h"
#include "bsp_usart.h"
void delay(uint32_t count)
{
while(count--);
}
int main(void)
{
USART_Config();
while(1)
{
printf("hello windows!\n");
delay(5000000);
}
}
2.3.3.修改如下
stm32f10x_it.c:

main.c:

2.3.4編譯及生成hex檔案

2.4.燒錄程式
2.4.1 連接開發板

2.4.2打開串口下載器選擇剛編譯生成的.hex檔案,然后進行燒寫

3.實驗結果

三、參考網址
STM32串口通信USART學習筆記
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/231058.html
標籤:其他
