前言
stm32f103c8t6最小核心学习板包含了以下成分:
1.四方扁平封装的主要MCU – STM32F103C8T6。
2.重置开关–重置微控制器。
3.microUSB端口–用于串行通信和电源。
4.BOOT选择器跳线– BOOT0和BOOT1跳线,用于选择引导存储器。
5.两个LED –用户LED和电源LED。
6.8 MHz晶振– MCU的主时钟。
7.32.768KHz振荡器– RTC时钟。
8.SWD接口–用于使用ST-Link进行编程和调试。
9.3.3V稳压器(在底部)–将5V转换为3.3V,以为MCU供电。
提示:以下是本篇文章正文内容,下面案例可供参考
一,寄存器配置
1,时钟控制
时钟控制名字叫做RCC,属于AHB总线。
![在这里插入图片描述](https://img-blog.csdnimg.cn/477c060230fa41ebb150681805ae3579.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_20,color_FFFFFF,t_70,g_se,x_16) 我们可以在6.3.7小节找到APB2外设时钟使能寄存器(RCC_APB2ENR),偏移地址是0x18,所以APB2的地址就是0x4002 1018。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d7dfc6953f864fbcbc83f35fb2f71d8f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_20,color_FFFFFF,t_70,g_se,x_16) 首先对RCC寄存器定义
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
根据上图可知,想要使GPIOX端口时钟使能,就可以把RCC_APB2ENR的位X赋值为1,就可以开启该端口的时钟。
RCC_APB2ENR |= (1<<3); //GPIOB端口时钟使能
RCC_APB2ENR |= (1<<4); //GPIOC端口时钟使能
RCC_APB2ENR |= (1<<2); //GPIOA端口时钟使能
2,GPIO端口设置:
总所周知,stm32每一组GPIO端口都配置有7种寄存器
1.端口配置低寄存器GPIOx_CRL 2.端口配置高寄存器(GPIOx_CRH) 3.端口输入数据寄存器(GPIOx_IDR) 4.端口输出数据寄存器(GPIOx_ODR) 5.端口位设置/ 清除寄存器(GPIOx_BSRR) 6.端口位清除寄存器(GPIOx_BRR) 7.端口配置锁定寄存器(GPIOx_LCKR)
STM32中,用端口配置低寄存器(GPIOx_CRL)来配置引脚Px0-Px7, 用端口配置高寄存(GPIOx_CRH)来配置引脚Px8-Px15。
我在实验中使用了A0,B9,C14三个串行口,定义的寄存器分别是
偏移地址是0x04,意思是在基地址的基础上再加0x04,所以,对于GPIOB来说就是0x4001 0c04。如果配置PB0-PB7,那么需要的寄存器是低位的寄存器GPIOB_CRL,它的地址是0x4001 0c00。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/def67add8234423296be8412c86951d1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_20,color_FFFFFF,t_70,g_se,x_16)
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ORD *((unsigned volatile int*)0x40010C0C)
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ORD *((unsigned volatile int*)0x4001100C)
其中GPIO_ORD寄存器的第一位设置为0则代表串行口输出低电平,ODR的第2位设置为1则代表P2口输出高电平。 已知点亮LED灯需要输出低电平,
GPIOA_ORD=0x0<<0; //PA0亮
Delay_ms(5000000); //设置时延
GPIOA_ORD=0x1<<0; //PA0灭
Delay_ms(5000000);
GPIOB_ORD=0x0<<9; //PB9亮
Delay_ms(5000000);
GPIOB_ORD=0x1<<9; //PB9灭
Delay_ms(5000000);
GPIOC_ORD=0x0<<15; //PC15亮
Delay_ms(5000000);
GPIOC_ORD=0x1<<15; //PC15灭
Delay_ms(5000000);
其中Delay_ms()是设置的时延函数,具体多少时间没有计算,跟着感觉来的。
再就是输出的选择 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d36ba33f6667414d8b187c94a0008bc4.png)
我们在这里使用的是推免输出。
二、实际操作
1.具体代码
#define GPIOB_BASE 0x40010C00BSRR:
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ORD *((unsigned volatile int*)0x4001080C)
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ORD *((unsigned volatile int*)0x40010C0C)
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ORD *((unsigned volatile int*)0x4001100C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
int main(){
RCC_APB2ENR |= (1<<3);
RCC_APB2ENR |= (1<<4);
RCC_APB2ENR |= (1<<2);
GPIOA_CRL&=0xFFFFFFF0;
GPIOA_CRL|=0x00000002;
GPIOA_ORD|=1<<0;
GPIOB_CRH&=0xFFFFFF0F;
GPIOB_CRH|=0x00000020;
GPIOB_ORD|=1<<9;
GPIOC_CRH&=0xF0FFFFFF;
GPIOC_CRH|=0x03000000;
GPIOC_ORD|=0x1<<14;
while(1)
{
GPIOA_ORD=0x0<<0;
Delay_ms(5000000);
GPIOA_ORD=0x1<<0;
Delay_ms(5000000);
GPIOB_ORD=0x0<<9;
Delay_ms(5000000);
GPIOB_ORD=0x1<<9;
Delay_ms(5000000);
GPIOC_ORD=0x0<<14;
Delay_ms(5000000);
GPIOC_ORD=0x1<<14;
Delay_ms(5000000);
}
}
2.keil5项目运行
1.新建项目名字为stm 2.芯片选择stm32f103c8 ![请添加图片描述](https://img-blog.csdnimg.cn/f4ffabfa05354368945b73402dedd359.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_17,color_FFFFFF,t_70,g_se,x_16)
![请添加图片描述](https://img-blog.csdnimg.cn/05addd28bb82410899dbf2fb371139e2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_20,color_FFFFFF,t_70,g_se,x_16) 4. ![请添加图片描述](https://img-blog.csdnimg.cn/860d1d60bd98451b93199dd7728245d6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_17,color_FFFFFF,t_70,g_se,x_16) ![请添加图片描述](https://img-blog.csdnimg.cn/50caa4a6ab6b42b18749068c65f88793.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_17,color_FFFFFF,t_70,g_se,x_16) 5.运行 ![请添加图片描述](https://img-blog.csdnimg.cn/eb6c38ed9b2f42c9a23c39ac23e4d51a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_20,color_FFFFFF,t_70,g_se,x_16)
没有错误
3.硬件的连接
固定连接:
USB接口 | STM32最小系统板 |
---|
GND | GND | 3V3 | 3V3 | RXD | A9 | TXD | A10 |
其余连接: 如图所示 ![请添加图片描述](https://img-blog.csdnimg.cn/8e8d46af3c1c4b88bf86ea4d91aec604.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_20,color_FFFFFF,t_70,g_se,x_16)
4.链接到 mcuisp 串口链接软件上
将硬件的usb接口链接到电脑上,然后点击 开始编程 ![请添加图片描述](https://img-blog.csdnimg.cn/f4d623215a564f9f8ee55c8a3ca4be93.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn5LqG5bCP5Liq5pif5pif,size_19,color_FFFFFF,t_70,g_se,x_16)
5,LED灯闪烁
![请添加图片描述](https://img-blog.csdnimg.cn/94cc30b73f0f4837b883ffea8708618b.gif)
总结
这次实验对我们的学习是一次很大的历练,学到了更多 的stm的知识,也增加了动手能力,虽然遇到了挺多困难的,但是还是有很多的收获。
参考文献
https://blog.csdn.net/qq_43445076/article/details/88896383 https://blog.csdn.net/geek_monkey/article/details/86291377 https://blog.csdn.net/geek_monkey/article/details/86293880
|