STM32最小系统核心板(STM32F103C8T6)完成LED流水灯实验

一、使用stm32CubeMX完成初始化过程,采用HAL库编程实现LED流水灯

1、新建项目

(1)、在stm32CubeMX界面完成项目的新建
在这里插入图片描述

(2)、在part number选择实验所用芯片(stm32f103c8t6),点击start project
在这里插入图片描述

(3)、首先点击System Core,选择SYS,Debug选择为Serial Wire
在这里插入图片描述

(4)、进入时钟配置,其中发现时钟有两个,HSE和LSE,流水灯实验使用GPIO接口,其中这些接口都在APB2总线里,APB2总线的时钟由HSE控制
在这里插入图片描述

进入Clock Configuration界面,可以观察到HSE来控制APB2总线,所以选择PLLCLK

在这里插入图片描述

将时钟HSE选择为Crystal/Ceramic Resonator

在这里插入图片描述

(5)、选择相应的引脚设置输出寄存器,分别GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯

在这里插入图片描述

(6)、进入Project Manager,设置项目名称以及项目存放地址,并将IDE设置为MDK-ARM
在这里插入图片描述

(7)、进入 Code Generate界面,选择生成初始化.c/.h文件,后面点击Generate Code,完成项目新建

在这里插入图片描述

2、使用keil进行仿真调试

(1)、进入keil,打开项目文件,将main.c文件中的int main()函数代码替换为以下内容:

SystemClock_Config();//系统时钟初始化
  MX_GPIO_Init();//gpio初始化
  while (1)
  {		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//PA5亮灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯
		HAL_Delay(1000);//延时1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯
		HAL_Delay(1000);//延时1s		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//PC14亮灯
		HAL_Delay(1000);//延时1s
	}

在这里插入图片描述
(2)、接入电路:
对于USB转TTL模块和stm32f103c8t6连接:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
红——A5
绿——C14
黄——B9

(3)、烧录运行
在这里插入图片描述

3、观察GPIO端口的输出波形

(1)、Debug页面进行更改设置
在这里插入图片描述
(2)、进入调试界面,选择逻辑分析仪
在这里插入图片描述
(3)、添加要观察的引脚:
在这里插入图片描述
(4)、设置Grid大小为1s
在这里插入图片描述
(5)、运行程序观察波形图
在这里插入图片描述

二、用寄存器方式完成流水灯实验

1、新建项目

(1)、选择stm32f103c8芯片
在这里插入图片描述
(2)、选择core,不选择startup
在这里插入图片描述
(3)、添加main.c文件
在这里插入图片描述
(4)、添加驱动文件
在这里插入图片描述

将驱动文件复制到main.c同文件夹下

在这里插入图片描述

右击文件夹,选择Add Existing Files to Group Source Group 1
在这里插入图片描述
选择All FIles,选择刚刚添加的启动文件添加
在这里插入图片描述

(5)、将下列代码复制至main.c文件中,并编译

#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 &= 0x0fffffff; //设置位 清零		
	GPIOC_CRH|=0x22200000;  //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(1000000);

		C_LED_LIGHT();
		Delay_ms(1000000);

		A_LED_LIGHT();
		Delay_ms(1000000);
	}
	
}


void SystemInit(){
	
}

2、烧录运行

在这里插入图片描述

在这里插入图片描述

三、总结

通过本次实验,我熟悉了stm32f103c8t6芯片,一些关于stm32芯片的一些相关知识,明白了通过STM32最小系统核心板GPIO端口控制LED灯,完成流水灯实验,了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。

四,参考链接

https://blog.csdn.net/weixin_46129506/article/details/120780184
http://t.csdn.cn/lDvSz

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值