- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如标题所说,如果我不在 WS2812_DMA_Stop
中包含对 HAL_DMA_Init(&hdma_tim2_ch1)
的调用,我的第一次传输工作正常,但所有后续传输都缺少第一个(1-4,通常是 3)个脉冲。
DMA 设置:
hdma_tim2_ch1.Instance = DMA1_Channel5;
hdma_tim2_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tim2_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim2_ch1.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim2_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_tim2_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_tim2_ch1.Init.Mode = DMA_CIRCULAR;
hdma_tim2_ch1.Init.Priority = DMA_PRIORITY_HIGH;
下面附上完整代码:
void WS2812_DMA_Stop() {
__HAL_TIM_DISABLE_DMA(&htim2, TIM_DMA_CC1);
TIM_CCxChannelCmd(htim2.Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);
__HAL_TIM_DISABLE(&htim2);
HAL_DMA_Init(&hdma_tim2_ch1);
ws2812_busy = 0;
}
void WS2812_DMA_ISR(uint8_t tc_flag) {
if (ws2812_current_led < WS2812_NUM_LEDS) {
if (tc_flag) {
WS2812_fill_buffer(ws2812_current_led, &ws2812_dma_buffer[WS2812_DMA_LED_SIZE]);
} else {
WS2812_fill_buffer(ws2812_current_led, &ws2812_dma_buffer[0]);
}
} else if (ws2812_current_led < (WS2812_NUM_LEDS + WS2812_RESET_PULSE_LEN)) {
if (tc_flag) {
memset(&ws2812_dma_buffer[WS2812_DMA_LED_SIZE], 0, sizeof(ws2812_dma_buffer[0]) * WS2812_DMA_LED_SIZE);
} else {
memset(&ws2812_dma_buffer[0], 0, sizeof(ws2812_dma_buffer[0]) * WS2812_DMA_LED_SIZE);
}
} else {
WS2812_DMA_Stop();
}
ws2812_current_led++;
}
void WS2812_DMA_HT(DMA_HandleTypeDef *hdma) {
WS2812_DMA_ISR(0);
}
void WS2812_DMA_TC(DMA_HandleTypeDef *hdma) {
WS2812_DMA_ISR(1);
}
void WS2812_DMA_Error(DMA_HandleTypeDef *hdma) {
_Error_Handler(__FILE__, __LINE__);
}
void WS2812_DMA_Start() {
ws2812_busy = 1;
for (ws2812_current_led = 0; ws2812_current_led < WS2812_DMA_NUM_LEDS; ws2812_current_led++) {
WS2812_fill_buffer(ws2812_current_led, &ws2812_dma_buffer[ws2812_current_led * WS2812_DMA_LED_SIZE]);
}
htim2.hdma[TIM_DMA_ID_CC1]->XferCpltCallback = WS2812_DMA_TC;
htim2.hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = WS2812_DMA_HT;
htim2.hdma[TIM_DMA_ID_CC1]->XferErrorCallback = WS2812_DMA_Error;
HAL_DMA_Start_IT(htim2.hdma[TIM_DMA_ID_CC1], (uint32_t)(&ws2812_dma_buffer[0]), (uint32_t)(&(htim2.Instance->CCR1)), WS2812_DMA_BUF_LEN);
__HAL_TIM_ENABLE_DMA(&htim2, TIM_DMA_CC1);
TIM_CCxChannelCmd(htim2.Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
__HAL_TIM_ENABLE(&htim2);
}
最佳答案
嗯,仍然不能 100% 确定原因,但看起来 HAL_DMA_Init
的关键行是 hdma->State = HAL_DMA_STATE_READY;
。仅用该行替换对 Init 的调用也可以解决问题。
关于c - STM32 PWM DMA 只有在我每次传输时都重新初始化时才能正常工作,否则会丢弃前几个脉冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63241954/
我有一个关于 Arduino 的一般性问题,如何每秒使用 AnalogRead() 读取一定次数的传感器值。每秒说 10 次,并且还不断地向电机输出 PWM。 如果我尝试延迟循环(),它会影响我与 A
我正在使用 iMX6Q SD 板。而且我必须访问背光驱动程序来控制背光对比度。如何从用户空间或内核空间访问? (背光PWM驱动路径为drivers/video/backlight/pwm_bl.c)。
这应该是一个简单的公式,但我无法理解。 我有一个 16mHZ AVR 芯片。 我需要运行一个 24kHZ 的 PWM 信号.. 决定最佳预分频器的公式是什么。 我正在使用 16 位定时器。 最佳答案
我试图将PWM用于端口B的任何引脚上的ATmega8上的LED。设置计时器一直很烦人,我不知道该如何处理OCR1A。这是我的代码,我希望收到一些反馈。 我只是想弄清楚如何使用PWM。我知道这个概念,O
我一直在 ATMega328P 上试验 PWM 波形生成模式。我得到了一些奇怪的结果,我无法确定是我编写固件的方式有问题还是我解释 datasheet 的方式有问题。 . 这是我为模拟 analogW
我想测量 PWM 信号的频率。为此,我使用了 STM-F401RE 及其 Timer_Input_Capture 函数。 问题是: 输入信号具有相当高的频率(大约 2MHz),并且, STM-F401
我正在使用 MPC 7555 Controller 。它有一个 16 位 Σ-Δ ADC。称为麦克风输入的信号被馈送到该 ADC 引脚。根据该电压,产生与ADC信号采样频率相同的PWM信号。 For
我想创建一个 PWM 信号。我希望频率接近 38 kHz。我的理论计算周期是 26.3 微秒。所以我选择26微秒。我可以观察我的信号。 但我不明白我的代码如何正常工作:) (我的时钟频率是1MHz,所
我正在尝试编写一个程序来生成正弦波,我将通过被动夏季输出这些正弦波,从而在我按下按钮时让微 Controller 播放声音。 我已经让 PWM 正常工作,并且可以使用常量值演奏音符,但我想使用正弦波而
我可能只是在使用这些寄存器之一时遇到了一个看不见森林的时刻,但我无法让 PWM 在 dsPIC33FJ32MC102 上工作微 Controller (警告:大 PDF)我正在玩。我已经遵循了数据表和
如何将字符串输出为列表? (可能很简单,我知道) 我查看了所有 google,NONE 的解决方案有效。 我的代码:(有点意译) import Pmw from tkinter import * ro
我正在尝试为每个对角线(在我的例子中为 PWM1 和 PWM4)使用一个 PWM 发生器来控制 H 桥转换器。 我希望能够同时控制频率和占空比。为此,我在 PWM4 周期开始时生成触发中断,然后更新两
在 Atmel ATmega328P (datasheet) 上,有三个定时器可用于 PWM 生成(定时器 0、定时器 1 和定时器 2)。 我已经有了使用 8 位 timer2 所需的东西,我只关心
我正在尝试用蜂鸣器和 Arduino 制作和弦音乐播放器。我在关注 this教程作为指南,但我无法弄清楚。代码就像: void playTone() { long elapsed_time =
我有一个 STM32F4,我想对一个已与掩码进行“或”运算的 GPIO 端口进行 PWM 处理。 所以,也许我们想要以 200khz 的频率 PWM 0b00100010 一段时间,但是,10khz
我建了this motor shield基于L298N芯片控制坦克的两个电机。一个电机使用引脚 5 和 6,另一个电机使用引脚 10 和 11。 尝试添加TSOP 4838时为了用红外 Remote
我有一个 STM32F4,我想对一个已与掩码进行“或”运算的 GPIO 端口进行 PWM 处理。 所以,也许我们想要以 200khz 的频率 PWM 0b00100010 一段时间,但是,10khz
我是 ARM MCU (STM32F411) 的新手,我一直在尝试使用 STM 的 HAL 库和 STM32Cube 寻找外围设备的方法。 为了使用一些外围设备,我已经配置了我的开发板: Timer
Raspberry pi B+ 有四个硬件 PWM。如何在 C/C++ 中使用它们。解决方案越简单越好。 我用 WiringPi 找到了一个可行的解决方案 gpio mode 1 pwm gpio
我一直在尝试在 PIC16F877 MCU 上使用 PWM 模块,但我得到的只是 CCP1/CCP2 引脚上的平坦低电平。 配置和启动 PWM 模块的代码如下。 // Configure PWM //
我是一名优秀的程序员,十分优秀!