Дано: плата STM32L-Discovery
Чип: STM32L152RB
IDE: Keil uVision 4.21.0
Задача: Пересылать значения из памяти в 4-й таймер, не затрагивая ядро.
Код: Выделить всё
#include <stm32l1xx.h>
#include <stm32l1xx_gpio.h>
#include <stm32l1xx_rcc.h>
#include <stm32l1xx_tim.h>
#include <stm32l1xx_dma.h>
const uint32_t dma_buffer[6] = { 64, 128, 255, 128, 64, 128 };
void mcu_dma_channel1_init(void)
{
DMA_InitTypeDef DMA_Config;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_Config.DMA_PeripheralBaseAddr = (uint32_t) & TIM4->CCR1;
DMA_Config.DMA_MemoryBaseAddr = (uint32_t) & dma_buffer;
DMA_Config.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_Config.DMA_BufferSize = 0x6;
DMA_Config.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_Config.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_Config.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_Config.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_Config.DMA_Mode = DMA_Mode_Circular;
DMA_Config.DMA_Priority = DMA_Priority_High;
DMA_Config.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_Config);
DMA_Cmd(DMA1_Channel1, ENABLE);
}
void mcu_tim4_init(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseConfig;
TIM_OCInitTypeDef TIM_OCConfig;
GPIO_InitTypeDef GPIO_Config;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOBEN, ENABLE);
GPIO_Config.GPIO_Pin = GPIO_Pin_7;
GPIO_Config.GPIO_Mode = GPIO_Mode_AF;
GPIO_Config.GPIO_OType = GPIO_OType_PP;
GPIO_Config.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Config.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_Init(GPIOB, &GPIO_Config);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_BaseConfig.TIM_Prescaler = (uint16_t) (SystemCoreClock / 4800000) - 1;
TIM_BaseConfig.TIM_Period = 0xff;
TIM_BaseConfig.TIM_ClockDivision = TIM_CKD_DIV4;
TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_BaseConfig);
/* Channel1 Configuration in PWM mode */
TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCConfig.TIM_Pulse = 0x01;
TIM_OC1Init(TIM4, &TIM_OCConfig);
TIM_SelectOCxM(TIM4,TIM_Channel_1,TIM_OCMode_PWM1 );
TIM_DMACmd (TIM4,TIM_DMA_CC1,ENABLE);
TIM_Cmd(TIM4, ENABLE);
}
int main(void)
{
mcu_dma_channel1_init();
mcu_tim4_init();
while (1)
{
}
}
Проблема: Не удается запустить DMA для 4-го таймера.
Симптомы: В отладчике регистр CCR1 меняет свои значения, но очень странно. Проскакивают значения из массива, но и проскакивают нули, которых там нет.
В железе не работает, диодик совсем не горит. Осцик показывает что там ничего нет.
