写C语言代码通过STM32F103使用PE口利用按键WKUP实现加法器功能(初值为0,每按一次按键,结果加1),并将该结果以二进制形式显示到LED0~LED15。用中断,定时等
时间: 2024-05-04 09:20:36 浏览: 106
以下是基于STM32F103的C语言代码,使用PE口实现加法器功能,并将结果以二进制形式显示在LED0-LED15上。
```c
#include "stm32f10x.h"
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void EXTI_Configuration(void);
void TIM_Configuration(void);
uint16_t result = 0;
int main(void)
{
GPIO_Configuration();
NVIC_Configuration();
EXTI_Configuration();
TIM_Configuration();
while (1)
{
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
//LED0-LED15所在的GPIOB口配置为输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//按键WKUP所在的GPIOA口配置为输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//配置按键WKUP所在的中断,优先级为1
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
//配置按键WKUP所在的外部中断线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//配置定时器TIM3,用于定时更新LED的状态
TIM_TimeBaseStructure.TIM_Period = 1999;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
//配置定时器TIM3的中断,优先级为2
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line0);
//按键WKUP被按下,结果加1
result++;
}
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//将结果转换为二进制并在LED上显示
uint16_t temp = result;
for (int i = 0; i < 16; i++)
{
if (temp & 0x0001)
{
GPIO_SetBits(GPIOB, 1 << i);
}
else
{
GPIO_ResetBits(GPIOB, 1 << i);
}
temp >>= 1;
}
}
}
```
在此代码中,我们使用了STM32F103的PE口来实现加法器功能,按下WKUP按键后,结果加1,并将结果以二进制形式显示在LED0-LED15上。我们还使用了中断和定时器来处理按键事件和LED状态更新。具体地,我们使用了EXTI0_IRQHandler函数来处理按键事件,使用TIM3_IRQHandler函数来定时更新LED的状态。
在GPIO_Configuration函数中,我们配置了GPIOA口的0号引脚为输入模式,GPIOB口的0-15号引脚为输出模式。在NVIC_Configuration函数中,我们配置了按键WKUP所在的中断,并将优先级设置为1。在EXTI_Configuration函数中,我们配置了按键WKUP所在的外部中断线,用于处理按键事件。在TIM_Configuration函数中,我们配置了定时器TIM3,并将优先级设置为2。在EXTI0_IRQHandler函数中,我们处理按键事件,将结果加1。在TIM3_IRQHandler函数中,我们将结果转换为二进制并在LED上显示。
这就是使用C语言代码通过STM32F103使用PE口利用按键WKUP实现加法器功能,并将结果以二进制形式显示在LED0-LED15上的实现方式。
阅读全文