最近用普冉的PY32F002B,采用PWM中斷的方式驅動WS2812B燈珠,先發送了一個0x55,用邏輯分析儀查看波形,發現波形不對,應顯示01010101,波形顯示卻是7個0碼,8個1碼,8個0碼,8個1碼,8個0碼,8個1碼,8個0碼,7個1碼,糾結了幾天未找到解決方法,故來此地向各位大佬求助。
/******************/
int main(void)
{
// 系統時鐘初始化
HAL_Init();
SystemClockConfig();
PWM_Interrupt_Init();
SendByte(0x55);
while (1)
{
}
}
/********************/
static volatile uint8_t current_bit_to_send = 0;
static volatile uint8_t byte_to_send = 0;
static volatile uint8_t bit_index = 0;
TIM_HandleTypeDef TimHandle;
TIM_OC_InitTypeDef sConfig;
RGB_Color leds[LED_COUNT];
void PWM_Interrupt_Init(void)
{
TimHandle.Instance = TIM1; /* TIM1 */
TimHandle.Init.Period = TOTAL_TIME - 1; /* Period = 30 - 1 */
TimHandle.Init.Prescaler = 1 - 1; /* Prescaler = 0 */
TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /* ClockDivision = 0 */
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; /* Counter direction = Up */
TimHandle.Init.RepetitionCounter = 1 - 1; /* Repetition = 0 */
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /* Auto-reload register not buffered */
if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK) /* Initialize TIM1 */
{
Error_Handler();
}
sConfig.OCMode = TIM_OCMODE_PWM1; /* Set output compare mode: PWM1 */
sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; /* OC channel output high level effective */
sConfig.OCFastMode = TIM_OCFAST_DISABLE; /* Disable OC FastMode */
sConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH; /* OCN channel output high level effective */
sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET; /* Idle state OC1N output low level */
sConfig.OCIdleState = TIM_OCIDLESTATE_RESET; /* Idle state OC1 output low level*/
sConfig.Pulse = 0;
if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
//使能時鐘
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0, 0); //最高優先級
HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM1)
{
bit_index++;
if(bit_index < 8)
{
current_bit_to_send = (byte_to_send << bit_index) & 0x80;
SendBit(current_bit_to_send);
}
else
{
// 停止PWM輸出并禁用中斷
HAL_TIM_PWM_Stop(&TimHandle, TIM_CHANNEL_1);
__HAL_TIM_DISABLE_IT(&TimHandle, TIM_IT_UPDATE);
}
}
}
// 發送一位數據
void SendBit(uint8_t bit)
{
if (bit)
{
// 發送1碼:高電平0.9us,低電平0.35us
__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_1, 22);
}
else
{
// 發送0碼:高電平0.35us,低電平0.9us
__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_1, 8);
}
}
// 發送一個字節數據(8位)
void SendByte(uint8_t byte)
{
byte_to_send = byte;
bit_index = 0;
current_bit_to_send = (byte_to_send << bit_index) & 0x80;
HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1);
SendBit(current_bit_to_send);
__HAL_TIM_ENABLE_IT(&TimHandle, TIM_IT_UPDATE);
}
/**********************/
主要程序附上,請問如何解決
|