一、STM32F103C8T6实现流水灯
1.创建项目
2.选择STM32F103C8开发板
创建项目出现弹窗,不勾选setup项,只勾选core项
3.在output里选择create hex file
4.source group里创建led.c,并写入代码,注意项目结构,使用的引脚是PA5,PB9,PC14
#include "stm32f10x.h"
// APB2使能时钟寄存器
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
// GPIOA配置寄存器
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C)
// GPIOB配置寄存器
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C)
// GPIOC配置寄存器
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C)
void SystemInit(){}
void delay(u32 time){
u32 i = 0;
while(time--){
i = 2000;
while(i--){
}
}
}
int main(void){
RCC_APB2ENR |= (1<<2); // GPIOA 时钟使能
RCC_APB2ENR |= (1<<3); // GPIOB 时钟使能
RCC_APB2ENR |= (1<<4); // GPIOC 时钟使能
GPIOA_CRL &= 0xFF0FFFFF; // 清空控制 PA5 的端口位
// F 的位置表示的是对应引脚的位置上的电压,从右向左 CRL 分别为1、2、……、8,CRH 分别为9、10、……、16
GPIOA_CRL |= 0x00300000; // PB5 推挽输出(和电压设置有关), 绿灯
//GPIOA_ODR &= ~(1<<5);
GPIOA_ODR |= 1<<5; // 设置灯初始状态为关闭
GPIOB_CRH &= 0xFFFFFF0F;
GPIOB_CRH |= 0x00000020; // 红灯
//GPIOA_ODR &= ~(1<<9);
GPIOB_ODR |= 1<<9;
GPIOC_CRH &= 0xF0FFFFFF;
GPIOC_CRH |= 0x02000000; // 黄灯
//GPIOC_ODR &= ~(1<<14);
GPIOC_ODR |= 1<<14;
while(1){
GPIOA_ODR &= ~(1<<5); //PB5低电平,因为是置0,所以用按位与
delay(1000);
GPIOA_ODR |= 1<<5; // 设置高电位
// 后面的两个灯的设置方式与上面相同
GPIOB_ODR &= ~(1<<9);
delay(1000);
GPIOB_ODR |= 1<<9;
GPIOC_ODR &= ~(1<<14);
delay(1000);
GPIOC_ODR |= 1<<14;
}
}
5.添加驱动文件后连接线路
6.烧录。在build之后会在object文件夹下有对应的hex文件生成
使用驱动进行烧录操作
连接到电脑,打开mcuisp,上传HEX文件到stm32f103c8t6上:
7.结果
二、用cubemx完成初始化过程,采用HAL库编程实现
1.安装STM32 HAL库
STM32 HAL固件库是Hardware Abstraction Layer的缩写,中文名称是:硬件抽象层。HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性。HAL库的推出,可以说ST也慢慢的抛弃了原来的标准固件库,这也使得很多老用户不满。但是HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。
和标准库对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在STM32系列MCU之间无缝移植,甚至在其他MCU也能实现快速移植。
并且从16年开始,ST公司就逐渐停止了对标准固件库的更新,转而倾向于HAL固件库和 Low-layer底层库的更新,停止标准库更新,也就表示了以后使用STM32CubeMX配置HAL/LL库是主流配置环境;
(1)打开桌面快捷方式STM32CubeMX 软件,点击右上角“Help”,选择“Manage embedded saftware packages”
(2)如下所示的选择型界面,勾选所需的HAL库
2.新建项目
(1)回到STMCubeMX的主界面,创建新项目
(2)在part name里选择自己的芯片,点击信息栏中的具体芯片信息选中,点击start project:
(3)点击system core,进入SYS,在debug下选择serial wire:
(4)配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在APB2里:
接下来观察时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上:
(5)接下来就是点击相应的引脚设置输出寄存器了,就是output那一项,一共选了三个,是PA5,PB9,PC14:
(6)点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM
(7)进入 code generate界面,选择生成初始化.c/.h文件,后面点击generate code,选择open project,然后就到KEIL5了
3.运行
三、总结
1、学习和理解STM32F103系列芯片的地址映射和寄存器映射原理
2、了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)