使用STM32最小系统核心板(STM32F103C8T6)点亮LED流水灯

使用STM32最小系统核心板(STM32F103C8T6)点亮LED流水灯

寄存器方法

一、GPIOx端口的各寄存器地址和详细参数

首先需要知道的是,STM32中对于GPIO口的操作,无非就是操作下面的寄存器而已,所谓的标准库也好,HAL库也好,它们都只是对操作寄存器的过程进行了封装,目的是为了减轻编程时的工作负担:

两个32位的配置寄存器:GPIOx_CRL、GPIOx_CRH

两个32位数据寄存器:GPIOx_IDR、GPIOx_ODR

一个32位的置位/复位寄存器:GPIOx_BSRR

一个16位复位寄存器:GPIOx_BRR

一个32位锁定寄存器:GPIOx_LCKR

二、创建项目

(1)配置

选择与自己芯片相同的选项

在这里插入图片描述

添加文件:
①添加已经存在文件
在新建的工程中添加启动文件(startup_stm32f10x_hd.s),该文件可以先到固件库中复制到此处startup_stm32f10x_hd.s。
②创建新文件
stm32f10x.h
手动新建,用于存放寄存器映射的代码,暂时为空。
main.c
手动新建,用于存放 main 函数,暂时为空。

项目内设置

点击魔法棒

在这里插入图片描述

经行如下设置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

![](D:\work\week6\图片\15.png
在这里插入图片描述

在这里插入图片描述

点击Settings

![](D:\work\week6\图片\16.png

在这里插入图片描述

(2)代码

stm32f10x.h

/*片上外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)

/*总线基地址,GPIO 都挂载到 APB2 上 */ #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define AHBPERIPH_BASE (PERIPH_BASE +0x20000) /*GPIOC 外设基地址*/ #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) //GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址 /* GPIOB 寄存器地址,强制转换成指针 */
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)

/*RCC 外设基地址*/
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
/*RCC 的 AHB1 时钟使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)

main.c

int main(void)
{
// 配置RCC寄存器,开启 GPIOC 端口时钟配置RCC寄存器
*(unsigned int *)0x40021018 |=(1<<4); // 配置CRL寄存器,配置 PC2 为通用推挽输出,速度为 10M //*(unsigned int *)GPIOC_CRL |=(1<<(4*2));
*(unsigned int *)0x40011000 |=(1<<(4*2));
//配置ODR寄存器,清空控制 PC2 的端口位
//*(unsigned int *)GPIOC_ODR &=~(1<<2);
*(unsigned int *)0x4001100C &=~(1<<2);
while (1)
{
}

void SystemInit(void)

{ }

}

标准库方法

一、准备工作

STM32标准外设库官方下载地址:https://www.st.com/zh/embedded-software/stm32-standard-peripheral-libraries.html

使用的芯片是STM32F103C8T6,所以选择F1

在这里插入图片描述

点击Get Latest,输入邮箱即可下载

在这里插入图片描述

将标准库里面的文件移交到自己的工程项目中

请参考博主:https://blog.csdn.net/weixin_43155866/article/details/88429527

二、实践操作

1、前置工作

新建项目选择这个芯片

在这里插入图片描述

点击魔法棒设置,勾选该选项(为后续烧录准备)

在这里插入图片描述

由题目要求,使用GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚来控制LED灯,在查询C8T6数据手册后,管脚分别连接红绿蓝三种颜色的LED灯
目标是把 GPIO 的引脚设置成推挽输出模式并且默认下拉,输出低电平,这样就能让 LED 灯亮起来

2、代码

#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800

#define RCC_APB2ENR (*(unsigned int *)0x40021018)

#define GPIOB_CRH (*(unsigned int *)0x40010C04) #define GPIOC_CRH (*(unsigned int *)0x40011004) #define GPIOA_CRL (*(unsigned int *)0x40010800)

#define GPIOB_ODR (*(unsigned int *)0x40010C0C) #define GPIOC_ODR (*(unsigned int *)0x4001100C) #define GPIOA_ODR (*(unsigned int *)0x4001080C)
``

void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}

void A_LED_LIGHT(){
GPIOA_ODR=0x0<<5; //PA5低电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x1<<14; //PC14高电平
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5高电平
GPIOB_ODR=0x0<<9; //PB9低电平
GPIOC_ODR=0x1<<14; //PC14高电平
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<5; //PA5高电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x0<<14; //PC14低电平
}

int main(){
int j=100;
// 开启时钟
RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟

// 设置 GPIO 为推挽输出
GPIOB_CRH&= 0xffffff0f; //清零
GPIOB_CRH|=0x00000020; //PB9推挽输出

GPIOC_CRH &= 0xf0ffffff; //清零	
GPIOC_CRH|=0x02000000;  //PC14推挽输出


GPIOA_CRL &= 0xff0fffff; //清零
GPIOA_CRL|=0x00200000; //PA5推挽输出

// 3个LED初始化为不亮(即高点位)
GPIOB_ODR |= (1<<9); 
GPIOC_ODR |= (1<<14); 
GPIOA_ODR |= (1<<5);  

while(j){
	
	B_LED_LIGHT();
	Delay_ms(300000);

	C_LED_LIGHT();
	Delay_ms(300000);

	A_LED_LIGHT();
	Delay_ms(300000);
}

}

void SystemInit(){
``
}

3、运行

1、build生成hex文件
在这里插入图片描述

2、调试

在这里插入图片描述

三、连接烧录

1、线路连接

准备工具:面包板、连接线、LED灯、USB转接口、STM32F103C8T6开发板

参考视频:https://www.bilibili.com/video/BV15a411C7Zu/?spm_id_from=333.999.0.0

2、烧录

https://blog.csdn.net/thisway_diy/article/details/131247134

四、结果

在这里插入图片描述

STM32F103C8T6最小系统板上实现流水灯,你需要准备以下材料和工具: 1. STM32F103C8T6最小系统核心板 2. 面包板 3. 3只红绿蓝LED灯 4. mcuisp驱动 5. startup驱动 6. STM32CubeMX软件 下面是实现流水灯的步骤: 1. 连接硬件:将STM32F103C8T6最小系统核心板插入面包板上,并将3只LED灯连接到板子上的GPIO引脚上。 2. 安装驱动:将mcuisp和startup驱动复制到合适的位置,确保它们可以被系统访问到。 3. 配置STM32CubeMX:使用STM32CubeMX软件生成初始化代码。打开软件,选择正确的芯片型号(STM32F103C8T6),然后配置GPIO引脚为输出模式,并将它们与LED灯连接起来。 4. 生成代码:在STM32CubeMX软件中生成初始化代码,并将其导出到你的工程目录中。 5. 编写代码:在你的工程目录中创建一个新的C文件,编写代码来控制流水灯的闪烁。你可以使用GPIO库函数来控制LED灯的状态。 6. 编译和下载:使用合适的编译工具编译你的代码,并将生成的二进制文件下载到STM32F103C8T6最小系统核心板上。 下面是一个示例代码,用于实现流水灯效果: ```c #include "stm32f1xx.h" void delay(uint32_t time) { while(time--); } int main(void) { // 初始化GPIO引脚 RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // 使能GPIOC时钟 GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13); // 清除PC13的配置 GPIOC->CRH |= GPIO_CRH_MODE13_0; // PC13配置为输出模式 while(1) { // 点亮LED灯 GPIOC->BSRR = GPIO_BSRR_BS13; // PC13置高,点亮LED灯 delay(1000000); // 延时一段时间 // 熄灭LED灯 GPIOC->BSRR = GPIO_BSRR_BR13; // PC13置低,熄灭LED灯 delay(1000000); // 延时一段时间 } } ``` 请注意,以上代码仅供参考,你可能需要根据你的具体硬件和需求进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值