#include "main.h" #include "stm32g0xx_hal.h" #define LED_COUNT 30 #define LED_COLOR_COMPONENTS 3 #define LED_TOTAL_BITS (LED_COUNT * LED_COLOR_COMPONENTS * 8) void send_led_color(uint8_t* color_data, uint16_t data_size) { for (int i = 0; i < data_size; i++) { for (int bit = 7; bit >= 0; bit--) { if (color_data[i] & (1 << bit)) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); __NOP(); __NOP(); __NOP(); __NOP(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); } else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); } } } } int main(void) { HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;//速度 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);//根据设定参数初始化GPIOA.0 //GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA.0 输出低电平 uint8_t color_data[LED_TOTAL_BITS / 8] = {0}; // Set the green component of the first LED to 255 color_data[0] = 0x00; send_led_color(color_data, LED_TOTAL_BITS / 8); while (1) {} }优化下
时间: 2024-01-10 20:04:55 浏览: 161
Keil.STM32G0xx_DFP.1.3.0_STM32G0的pack_
5星 · 资源好评率100%
有几个地方可以进行优化:
1. 在 `send_led_color` 函数中,每次循环都会重复计算 `1 << bit`,可以将其提前计算并保存在变量中,以提高效率。
2. 在 `HAL_GPIO_WritePin` 函数调用之前加上 `__NOP()` 指令是为了增加延时,但这种方式并不可靠,建议使用定时器或者内部延时函数来控制延时。
3. 在初始化 `GPIOA` 时,可以使用结构体初始化的方式,避免初始化代码过于冗长。
综上所述,可以进行如下优化:
```c
#include "main.h"
#include "stm32g0xx_hal.h"
#define LED_COUNT 30
#define LED_COLOR_COMPONENTS 3
#define LED_TOTAL_BITS (LED_COUNT * LED_COLOR_COMPONENTS * 8)
#define DELAY_US 10 // 延时时间,单位微秒
void send_led_color(uint8_t* color_data, uint16_t data_size) {
uint8_t bit_mask;
for (int i = 0; i < data_size; i++) {
for (int bit = 7; bit >= 0; bit--) {
bit_mask = 1 << bit;
if (color_data[i] & bit_mask) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_DelayMicroseconds(DELAY_US);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_DelayMicroseconds(DELAY_US);
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_DelayMicroseconds(DELAY_US);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_DelayMicroseconds(DELAY_US);
}
}
}
}
int main(void) {
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {
.Pin = GPIO_PIN_5,
.Mode = GPIO_MODE_OUTPUT_PP,
.Pull = GPIO_NOPULL,
.Speed = GPIO_SPEED_FREQ_HIGH,
};
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
uint8_t color_data[LED_TOTAL_BITS / 8] = {0};
color_data[0] = 0x00; // Set the green component of the first LED to 255
send_led_color(color_data, LED_TOTAL_BITS / 8);
while (1) {}
}
```
阅读全文