#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 21:04:55 浏览: 169
有几个地方可以进行优化:
在
send_led_color
函数中,每次循环都会重复计算1 << bit
,可以将其提前计算并保存在变量中,以提高效率。在
HAL_GPIO_WritePin
函数调用之前加上__NOP()
指令是为了增加延时,但这种方式并不可靠,建议使用定时器或者内部延时函数来控制延时。在初始化
GPIOA
时,可以使用结构体初始化的方式,避免初始化代码过于冗长。
综上所述,可以进行如下优化:
#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) {}
}
相关推荐

















