使用STM32控制TMI1638输出8个LED8个数码管8个按键

本次实验用到的TMI1638是淘宝优信电子上面购买的,可实现8个LED8个数码管8个按键
在这里插入图片描述

首先创建TM1638.H和TM1638.C文件、需要注意的是引脚定义,SYS,H和delay可直接用正点原子的代码,代码如下:

TM1638.H

#ifndef __TM1638_H
#define __TM1638_H
 
#define	DATA_COMMAND	0X40
#define	DISP_COMMAND	0x80
#define	ADDR_COMMAND	0XC0
 
//TM1638模块引脚定义
#define DIO_SET()    GPIO_SetBits(GPIOB, GPIO_Pin_7)
#define DIO_RESET()  GPIO_ResetBits(GPIOB, GPIO_Pin_7)
#define CLK_SET()    GPIO_SetBits(GPIOB, GPIO_Pin_8)
#define CLK_RESET()  GPIO_ResetBits(GPIOB, GPIO_Pin_8)
#define STB_SET()    GPIO_SetBits(GPIOB, GPIO_Pin_9)
#define STB_RESET()  GPIO_ResetBits(GPIOB, GPIO_Pin_9)
 
#define DIO_IN() GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)
 
void TM1638_Write(unsigned char	DATA);
unsigned char TM1638_Read(void);
void Write_COM(unsigned char cmd);
unsigned char Read_key(void);
void Write_DATA(unsigned char add,unsigned char DATA);
void Write_oneLED(
<think>好的,用户需要配置STM32F103C8T6的TIM1和TIM2作为计数器,并请求示例代码和初始化步骤。首先,我得回忆一下STM32的定时器配置流程,特别是作为计数器使用的部分。根据引用内容,定时器的配置通常涉及时基初始化结构体,比如TIM_TimeBaseInitTypeDef,其中需要设置预分频器、计数模式、自动重载值等参数。引用1提到TIM_Prescaler、TIM_CounterMode、TIM_Period这些成员变量,这些是关键。用户要配置计数器,可能需要使用外部时钟模式,而不是普通的定时器中断模式。接下来,用户使用的是TIM1和TIM2。TIM1是高级定时器,而TIM2是通用定时器。引用5指出,高级定时器有更多功能,但作为计数器,基本配置可能类似。需要注意的是TIM1的时钟源和引脚配置可能与其他定时器不同,比如TIM1的通道可能对应不同的GPIO,需要查阅数据手册确认。 用户提供的引用4中的代码是配置TIM2作为定时器中断的例子,但这里需要改为计数器模式。计数器通常使用外部信号作为时钟源,比如编码器输入或者外部脉冲。因此,需要配置定时器为外部时钟模式,例如使用TIM_ETR引脚输入。 配置步骤可能包括:1.使能定时器和GPIO的时钟。2.配置GPIO引脚为输入模式,用于接收外部信号。 3.配置定时器的时基参数,包括预分频器和自动重载值。 4.设置定时器为外部时钟模式,选择触发源(如TIM_TS_ETRF)。5.使能定时器并启动计数。 需要注意的是,TIM1和TIM2的ETR引脚可能不同,比如TIM1的ETR是PA12,而TIM2的ETR是PA0,但需要根据数据手册确认。引用3提到PA0对应TIM2_CH1和TIM5_CH1,但作为ETR可能不同。可能用户需要将外部脉冲接到特定的ETR引脚上。另外,初始化结构体的配置,如TIM_Prescaler设置为0,因为预分频器会影响输入频率的分频。自动重载值TIM_Period设置为最大值0xFFFF,以计数更多的脉冲。计数模式可能需要设置为向上计数。在代码示例中,需要分别初始化TIM1和TIM2,可能使用不同的GPIO和时钟源配置。此外,可能需要配置输入滤波器和触发极性,以确保信号稳定。最后,需要测试计数器是否正常工作,可以通过读取CNT寄存器的值来确认。用户可能需要编写函数来获取当前的计数值,并在主循环中显示或处理。 需要确保引用的正确性,比如引用1提到时基结构体的成员,引用3关于寄存器的配置,以及引用4中的中断处理,但这里可能不需要中断,因为用户只需要计数功能。不过,如果需要溢出处理,可能需要配置自动重载并启用更新中断。总结步骤:配置GPIO,设置定时器为外部时钟模式,配置时基参数,启动定时器。提供示例代码,并提醒用户注意引脚对应和时钟使能。</think>### STM32F103C8T6定时器配置为计数器(TIM1&TIM2) #### 一、配置思路 1. **定时器模式选择**:将定时器配置为外部时钟模式(计数外部脉冲) 2. **引脚映射**:TIM1使用ETR引脚PA12,TIM2使用ETR引脚PA0[^3][^5] 3. **参数配置**:预分频器、计数器模式、自动重载值 4. **时钟源配置**:选择外部触发输入(TIM_TS_ETRF) #### 二、示例代码(标准库) ```c #include "stm32f10x.h" void TIM1_Counter_Init(void) { // 1. 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置ETR引脚(PA12) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 3. 定时器基础配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 最大计数值 TIM_TimeBaseStructure.TIM_Prescaler = 0; // 无预分频 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 4. 配置外部时钟模式2 TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); // 5. 启动计数器 TIM_Cmd(TIM1, ENABLE); } void TIM2_Counter_Init(void) { // 1. 使能时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置ETR引脚(PA0) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 3. 定时器基础配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 4. 配置外部时钟模式1 TIM_ETRClockMode1Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0); // 5. 启动计数器 TIM_Cmd(TIM2, ENABLE); } // 获取计数值函数 uint16_t TIM_GetCounterValue(TIM_TypeDef* TIMx) { return TIM_GetCounter(TIMx); } ``` #### 三、关键配置说明 1. **时钟模式选择**: - TIM1使用模式2(TIM_ETRClockMode2Config) - TIM2使用模式1(TIM_ETRClockMode1Config)[^5] 2. **滤波设置**:`TIM_ExtTRGPSC_OFF`表示无预分频滤波 3. **极性设置**:`TIM_ExtTRGPolarity_NonInverted`表示上升沿有效 #### 四、使用注意事项 1. **脉冲输入范围**:外部信号频率需小于$f_{CK\_CNT} = \frac{f_{TIM}}{(PSC+1)}$[^1] 2. **引脚复用**:需通过AFIO映射时需启用`RCC_APB2Periph_AFIO`时钟 3. **计数器溢出**:当计数值超过0xFFFF时会自动归零 4. **抗干扰处理**:可在初始化时添加输入滤波器参数[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值