keil用二值信号量实现LED灯的交替闪烁的代码
时间: 2023-10-26 18:12:15 浏览: 157
这里是一份使用Keil软件的二值信号量实现LED灯的交替闪烁代码:
```
#include <stdio.h>
#include <stdlib.h>
#include "stm32f10x.h"
#include "cmsis_os.h"
osSemaphoreId led_sem; // 二值信号量定义
void led_thread1(void const *argument) {
while (1) {
osSemaphoreWait(led_sem, osWaitForever); // 等待信号量
GPIO_ResetBits(GPIOB, GPIO_Pin_0); // LED1亮
osDelay(500); // 延时500ms
GPIO_SetBits(GPIOB, GPIO_Pin_0); // LED1灭
osSemaphoreRelease(led_sem); // 释放信号量
}
}
void led_thread2(void const *argument) {
while (1) {
osSemaphoreWait(led_sem, osWaitForever); // 等待信号量
GPIO_ResetBits(GPIOB, GPIO_Pin_1); // LED2亮
osDelay(500); // 延时500ms
GPIO_SetBits(GPIOB, GPIO_Pin_1); // LED2灭
osSemaphoreRelease(led_sem); // 释放信号量
}
}
int main(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
osSemaphoreDef(led_sem); // 定义二值信号量
led_sem = osSemaphoreCreate(osSemaphore(led_sem), 1); // 创建二值信号量,初始值为1
osThreadDef(led_thread1, osPriorityNormal, 1, 0);
osThreadCreate(osThread(led_thread1), NULL);
osThreadDef(led_thread2, osPriorityNormal, 1, 0);
osThreadCreate(osThread(led_thread2), NULL);
while (1) {
osSemaphoreRelease(led_sem); // 释放信号量
osDelay(1000); // 延时1s
}
}
```
阅读全文