使用库函数编程点亮开发板上的8只LED灯(使用位带和SysTick)。控制规律如下: 奇数的4只灯与偶数的4只灯交替点亮,间隔时间为1秒。
时间: 2023-05-13 14:05:30 浏览: 146
以下是使用库函数编程点亮开发板上的8只LED灯的代码,使用位带和SysTick控制:
#include "stm32f10x.h"
#define LED_ODR_Addr GPIOB_BASE+0x0C //LED的输出数据寄存器ODR地址
#define LED_ODR_BitNum 8 //LED在ODR中的位序号
void SysTick_Init(void)
{
SysTick->CTRL &= ~(1 << 2); //选择外部时钟源
SysTick->CTRL &= ~(1 << 1); //关闭中断
SysTick->CTRL |= 1; //使能SysTick定时器
}
void Delay_ms(uint32_t nTime)
{
SysTick->LOAD = 9000 * nTime; //设置定时器的重载值
SysTick->VAL = 0; //清空计数器
while(!(SysTick->CTRL & (1 << 16))); //等待计数器计满
}
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | 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); //初始化GPIOB
uint32_t LED_ODR_Addr_Mask = 1 << LED_ODR_BitNum; //LED在ODR中的位掩码
uint32_t LED_ODR_Addr_Even = LED_ODR_Addr_Mask << 1; //偶数LED在ODR中的位掩码
uint32_t LED_ODR_Addr_Odd = LED_ODR_Addr_Mask; //奇数LED在ODR中的位掩码
while(1)
{
GPIOB->ODR |= LED_ODR_Addr_Even; //点亮偶数LED
GPIOB->ODR &= ~LED_ODR_Addr_Odd; //熄灭奇数LED
Delay_ms(1000); //延时1秒
GPIOB->ODR &= ~LED_ODR_Addr_Even; //熄灭偶数LED
GPIOB->ODR |= LED_ODR_Addr_Odd; //点亮奇数LED
Delay_ms(1000); //延时1秒
}
}
注意:以上代码仅供参考,具体实现可能需要根据实际情况进行调整。
阅读全文