目录
一.STM32F103C8T6简介
1.定义
2.各字段定义
二.GPIO端口初始化设置
1.时钟设置
? 2.输入输出和输出速率设置
三.代码实现
1.c语言实现
2.烧录
3.烧录结果?
四、STM32CubeMX生成代码使用HAL库点亮流水灯
1.安装HAL库
?编辑?2.keil仿真调试?
3观察GPIO端口的输出波形
4.电路连接?
5.实物图
5.烧录
6.运行效果
五.参考资料
一.STM32F103C8T6简介
1.定义
STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。
2.各字段定义
STM32(芯片系列):STM32代表ARM Cortex-M 内核的32位微控制器 103(芯片子系列):101基本型,102USB基本型(USB2.0),103代表增强型系列,105或107互联型 F(产品类型):F代表通用系列 C(引脚数量):T=36, C=48, R=64, V=100 , Z =144 8(闪存容量):4=16K,6=32K,8=64K,B=128K,C=256K,D=384K,E=512K T(表封装): H代表BGA封装 T代表LQFP封装 U代表VFQFPN封装 Y代表WLCSP64 6(工作温度范围):6代表-40 — 85℃,7代表-40 —105℃
二.GPIO端口初始化设置
要求分别在GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒
因为本次实验采用GPIOA、B、C三个端口。该三个端口都属于APB2总线所以可以使用STM32中文参考手册进行查询,这里给出下载地址
百度网盘 请输入提取码
提取码:uwi5
1.时钟设置
1.找到时钟使能寄存器映射基地址,如图复位和时钟控制(RCC)地址0x4002 1000 - 0x4002 13FF

?2.找到端口偏移地址以及对应端口所在位置

3.使其能对应端口时钟
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能
? 2.输入输出和输出速率设置
本次实验采用通用推挽输出模式,最高输出时钟频率2Mhz。分别用到A4、B5、C14三个引脚。其中A4、B5属于端口配置低寄存器偏移地址为0x00,C13属于端口配置高寄存器偏移地址为0x04。

?通过查询找到GPIOx端口基地址

配置对应引脚寄存器,基地址+偏移量
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
三.代码实现
3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。
可以用1表示灯亮,0表示灯灭,初始状态灯全灭为000,然后依次亮灯状态一为100,
状态二为010,状态三为001,然后回归为状态一。
1.c语言实现
打开keil软件,创建工程,选择对应的控制器

控制器配置如下 ?
将驱动文件添加到主程序文件夹

?编译代码
//--------------APB2???????------------------------
#define RCC_AP2ENR *((unsigned volatile int*)0x40021018)
//----------------GPIOA????? ------------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
//----------------GPIOB????? ------------------------
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ORD *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC????? ------------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ORD *((unsigned volatile int*)0x4001100C)
//-------------------???????-----------------------
void Delay_wxc( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
//------------------------???--------------------------
int main()
{
int j=100;
RCC_AP2ENR|=1<<2; //APB2-GPIOA??????
RCC_AP2ENR|=1<<3; //APB2-GPIOB??????
RCC_AP2ENR|=1<<4; //APB2-GPIOC??????
//????????? RCC_APB2ENR|=1<<3|1<<4;
GPIOA_CRL&=0x0FFFFFFF; //??? ??
GPIOA_CRL|=0x20000000; //PA7????
GPIOA_ORD|=1<<7; //???????
GPIOB_CRH&=0xFFFFFF0F; //??? ??
GPIOB_CRH|=0x00000020; //PB9????
GPIOB_ORD|=1<<9; //???????
GPIOC_CRH&=0x0FFFFFFF; //??? ??
GPIOC_CRH|=0x30000000; //PC15????
GPIOC_ORD|=0x1<<15; //???????
while(j)
{
GPIOA_ORD=0x0<<0; //PB0???
Delay_wxc(1000000);
GPIOA_ORD=0x1<<0; //PB0???
Delay_wxc(1000000);
GPIOB_ORD=0x0<<9; //PB9???
Delay_wxc(1000000);
GPIOB_ORD=0x1<<9; //PB9???
Delay_wxc(1000000);
GPIOC_ORD=0x0<<15; //PC15???
Delay_wxc(1000000);
GPIOC_ORD=0x1<<15; //PC15???
Delay_wxc(1000000);
}
}

2.烧录
将生成的hex文件进行烧录?

3.烧录结果?

?
?
四、STM32CubeMX生成代码使用HAL库点亮流水灯
请自行安装好STM32CubeMX
1.安装HAL库
打开安装好的STMCubeMX,创建新项目,在part name里选择自己的芯片
?
点击system core,进入SYS,在debug下选择serial wire
?配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,我们要用是GPIO接口,而这些接口都在APB2里?
??接下来观察时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上
?将hse那里设为Crystal/Ceramic Resonator?
?
接下来就是点击相应的引脚设置输出寄存器了,就是output那一项,一共选了三个,是PA4,PB9,PC15?
?点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM?
?2.keil仿真调试?
打开.uvprojx文件(或者在上一步选择open project)打开main.c文件,滑倒主函数那一部分
?
?将下面代码放入主函数中(替代里面的内容)
SystemClock_Config();//系统时钟初始化
MX_GPIO_Init();//gpio初始化
while (1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
HAL_Delay(1000);//延时1s
}
? ?
3观察GPIO端口的输出波形
Debug页的设置

点击Debug,进入调试界面选择逻辑分析仪
?选择要观察的引脚: 点击Setup Logic Analyzer
?
?相关设置

运行程序

观察波形
引脚为低电平的灯亮,高电平的灯不亮,高低电平转换周期(LED闪烁周期)为1s左右。?
4.电路连接?
根据设计的程序连接电路: 对于USB转TTL模块和stm32f103c8t6连接: GND — GND 3v3 — 3v3 TXD — A10 RXD — A9
总电路: 红——B9 绿——C15 黄——A4
5.实物图

5.烧录

6.运行效果
?
五.参考资料
stm32寄存器实现流水灯
STM32F103C8T6实现流水灯
stm32cubeMX使用HAL库点亮LED流水灯
|