基于keil5,c++语言,芯片STM32F103CB,头文件只使用一个"stm32f10x.h"的情况下编写代码实现当按下复位按键时,开发板上的PA8和PD2同时点亮,当按PC5按键时,开发板上的LED0熄灭,当按下PA15按键时,开发板上的LED1熄灭。
时间: 2024-02-26 15:56:22 浏览: 19
好的,以下是代码实现:
```c++
#include "stm32f10x.h"
int main()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_IOPCEN; // 使能 PA、PD、PC 端口时钟
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // 使能 AFIO 时钟
GPIOA->CRH &= ~(GPIO_CRH_CNF8 | GPIO_CRH_MODE8); // PA8 清除配置
GPIOA->CRH |= GPIO_CRH_MODE8_0; // PA8 输出模式,最大输出速度 10MHz
GPIOA->ODR |= GPIO_ODR_ODR8; // PA8 输出高电平
GPIOD->CRL &= ~(GPIO_CRL_CNF2 | GPIO_CRL_MODE2); // PD2 清除配置
GPIOD->CRL |= GPIO_CRL_MODE2_0; // PD2 输出模式,最大输出速度 10MHz
GPIOD->ODR |= GPIO_ODR_ODR2; // PD2 输出高电平
GPIOC->CRL &= ~(GPIO_CRL_CNF5 | GPIO_CRL_MODE5); // PC5 清除配置
GPIOC->CRL |= GPIO_CRL_CNF5_1; // PC5 下拉输入模式
GPIOC->ODR |= GPIO_ODR_ODR5; // PC5 上拉
GPIOA->CRH &= ~(GPIO_CRH_CNF15 | GPIO_CRH_MODE15); // PA15 清除配置
GPIOA->CRH |= GPIO_CRH_MODE15_0; // PA15 输出模式,最大输出速度 10MHz
GPIOA->ODR |= GPIO_ODR_ODR15; // PA15 输出高电平
while(1)
{
if((GPIOC->IDR & GPIO_IDR_IDR5) == 0) // PC5 按键按下
{
GPIOA->ODR &= ~GPIO_ODR_ODR8; // PA8 输出低电平,LED0 点亮
}
else
{
GPIOA->ODR |= GPIO_ODR_ODR8; // PA8 恢复高电平,LED0 熄灭
}
if((GPIOA->IDR & GPIO_IDR_IDR15) == 0) // PA15 按键按下
{
GPIOA->ODR &= ~GPIO_ODR_ODR1; // PA1 输出低电平,LED1 点亮
}
else
{
GPIOA->ODR |= GPIO_ODR_ODR1; // PA1 恢复高电平,LED1 熄灭
}
}
return 0;
}
```
注意事项:
1. 代码中使用了按位或运算符 `|` 进行多个寄存器的配置,不同的芯片可能会有不同的寄存器名和位域名,需要根据实际情况进行修改。
2. 按钮需要接上拉电阻或下拉电阻,这里的代码假设 PC5 按钮接了下拉电阻,PA15 按钮接了上拉电阻,如果实际电路不同需要进行修改。
3. 描述中提到了复位按键,但没有说明具体是哪个按键,这里假设是 NRST 引脚,一般不需要在代码中进行配置,可以直接使用。