历史上的今天
今天是:2025年04月09日(星期三)
2019年04月09日 | STM32F103+HAL+PWM+DMA+WS2812
2019-04-09 来源:eefocus
如题:用HAL库,通过stm32f103r8的PWM的DMA模式控制WS2812
硬件使用的是TIM3的CHANNEL1硬件配置如下:

时钟为常规时钟配置

定时器3产生1.25us周期需要的arr为89(计算略)

DMA配置如下:

几个需要注意的地方,
1.DMA
1.1DMA方向 Memory To Peripheral (默认为Peripheral To Memory)
1.2DMA传输位宽 Half Word
2.定义数组

2.1一定要定位为16bit,
3.定义高低位
#define BIT_1 61u //1比较值为61 850us
#define BIT_0 28u //0比较值为28 400us
4. //发送函数
void TM7812_show(void)
{
uint8_t i, j;
for(i = 0; i < PIXEL_MAX; i++)
{
for(j = 0; j < 8; j++)
{
frame.data[24 * i + j] = (rBuffer[i] & (0x80 >> j)) ? BIT_1 : BIT_0; //将高低位扩展到16bit
frame.data[24 * i + j + 8] = (gBuffer[i] & (0x80 >> j)) ? BIT_1 : BIT_0;
frame.data[24 * i + j + 16] = (bBuffer[i] & (0x80 >> j)) ? BIT_1 : BIT_0;
}
}
HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)&frame, 3 + 24 * PIXEL_MAX + 1); //虽然传的是16bit但是要先转为32bit指针,
//貌似是函数要求为32位无符号指针,但实际传输时,因为之前定义的为half word,所以还是16bit传输;
//不对还请指正
}
5.PWM的DMA完成中断回调函数
因为HAL库自身清楚DMA标志的时候并没有停止PWM所以需要手动停止
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);
}
史海拾趣
|
请教各位高手: 我按照LM2678资料上的图搭了一个电路,输入电压35V,输出电压25V,带5欧姆负载,希望输出5A电流; 芯片用的是LM2678-ADJ,输入电容是470UF的铝电解电容再并一个0.47UF的瓷介电容;R1 ...… 查看全部问答> |
|
针对产品:EX系列中EX-375可调开关电源 性能: 带PFC最大输出功率375W 0-60V输出可调 0-25A可调 特性:在低电压输出时能保证大电流输出,高电压时能保证小电流输出设定 可控制功率恒定 精度良好,可靠性五星 背面图 (前进后出的风道结 ...… 查看全部问答> |
|
我原来访问PCI卡都是直接调用板卡的驱动,我昨天听人说可以通过设置一块卡做为主控设备,其它卡为辅助设备,主控设备里如果是程序,就可以编程直接访问辅助设备的IO,而不需要计算机的干扰。 我以前还没有见过,请问这个方式可以实现吗?需要怎么 ...… 查看全部问答> |
|
1.用PB定制系统时 Release和Debug有什么区别 Debug版的要占用更多的内存吗? 我的程序在Release版下 可以正常运行 在Debug版下 系统提示内存不足。 … 查看全部问答> |
|
各位老大们: 我现在遇到一个很棘手的菜鸟问题!!希望大家指点一二。 是这样的 我最近在读一个关于客户端和服务器的程序。socket连接正常,但是我从客户端往服务器发送数据包的时候,服务器却总是显示接收第0包数据,而且我想从客户端再发另一个 ...… 查看全部问答> |
|
晓舟通用在线调试系统(MornShip Universal Online Debug System,简称MSUODS)是晓舟工作室研发的具有完全自主知识产权的通用型嵌入式实时在线调试系统。MSUODS针对所有采用8051(兼容)指令的芯片,利用串口通讯实现了通行在线调试仿真系统(ICE/JTAG) ...… 查看全部问答> |




