stm32F103的LED亮灭之版本1(寄存器地址版)

目录

一. 实验目的:

二、STM32介绍

1、STM32F103C8T6

2、GPIOx端口的各寄存器地址

三.实验的实现

仿真代码:

proteus仿真:

烧录:


一. 实验目的:

1、了解stm32f103c8t6最小核心板的主要引脚接口;

2、掌握Keil 开发stm32程序的环境搭建和设置;

3、使用GPIO引脚,外接LED灯,编写程序让LED灯周期性亮灭。

二、STM32介绍

1、STM32F103C8T6

核心板原理图:

2、GPIOx端口的各寄存器地址

端口配置低寄存器(GPIOx_CRL)(x=A…E)

端口配置高寄存器(GPIOx_CRH)(x=A…E)

端口输入数据寄存器(GPIOx_IDR)(x=A…E)

端口输出数据寄存器(GPIOx_ODR)(x=A…E)

端口位设置/复位寄存器(GPIOx_BSRR)(x=A…E)

端口位复位寄存器(GPIOx_BRR)(x=A…E)

端口配置锁定寄存器(GPIOx_LCKR)(x=A…E)

三.实验的实现

打开keil建立一个新的项目,选择STM32F103C8芯片

点击Target 1左边的加号,右击出现的Source Group 1,选择第二行,选择C File,再在name一行填入main,点击OK,再次右击Source Group 1,选择第三行选择All File,将下列网盘中的startup_stm32f10x_md.s文件选中添加进去

仿真代码:

 
#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<<4;		//PA4低电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x1<<13;		//PC13高电平
}
void B_LED_LIGHT(){
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x0<<9;		//PB9低电平
	GPIOC_ODR=0x1<<13;		//PC13高电平
}
void C_LED_LIGHT(){
	GPIOA_ODR=0x1<<4;		//PA4高电平
	GPIOB_ODR=0x1<<9;		//PB9高电平
	GPIOC_ODR=0x0<<13;		//PC13低电平	
}
 
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 &= 0xff0fffff; //设置位 清零		
	GPIOC_CRH|=0x00300000;  //PC15推挽输出
 
 
	GPIOA_CRL &= 0xfff0ffff; //设置位 清零		
	GPIOA_CRL|=0x00010000; //PA4推挽输出
 
	// 3个LED初始化为不亮(即高点位)
	GPIOB_ODR |= (1<<9); 
	GPIOC_ODR |= (1<<13); 
	GPIOA_ODR |= (1<<4);  
	
	while(j){
		
		B_LED_LIGHT();
		Delay_ms(2000);//单片机上2000    100
 
		C_LED_LIGHT();
		Delay_ms(3000);//单片机上3000    200
 
		A_LED_LIGHT();
		Delay_ms(3000);//单片机上3000    200
	}
	
}
 
 
void SystemInit(){
	
}

在main.c中写入代码,然后点击编译生成hex文件,然后再Proteus中运行:

proteus仿真:

烧录:

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103C8T6是一款常用的单片机,它具有丰富的外设和强大的性能。要实现定时一分钟LED亮灭的功能,可以使用定时器和GPIO控制。 首先,需要配置一个定时器来实现定时功能。可以选择TIM2或TIM3定时器,它们都具有足够的功能和灵活性。以下是实现步骤: 1. 配置定时器的时钟源和预分频系数,使得定时器的时钟频率为1MHz(假设系统时钟为72MHz)。 2. 设置定时器的自动重装载寄存器(ARR)为60000,这样定时器将在1分钟后溢出。 3. 使能定时器的更新中断,并设置优先级。 4. 启动定时器。 接下来,需要配置一个GPIO引脚来控制LED亮灭。假设LED连接在GPIOA的第5个引脚上。 1. 配置GPIOA的时钟使能。 2. 配置GPIOA的第5个引脚为推挽输出模式。 3. 设置GPIOA的第5个引脚输出高电平,使LED熄灭。 最后,在定时器的更新中断处理函数中,每次定时器溢出时,切换LED的状态,即将GPIOA的第5个引脚输出电平取反。 下面是相关代码示例: ```c #include "stm32f10x.h" void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { GPIOA->ODR ^= GPIO_Pin_5; // 切换LED状态 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中断标志位 } } int main(void) { // 配置定时器 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 60000 - 1; TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM2, ENABLE); // 配置LED引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_5); while (1) { // 主循环中可以进行其他操作 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值