1、功能说明
    1、TIM1 和 TIM8 CH1 CH2 CH3 CH4 8路信号进行DMA PWM输出
    2、使用环境
    软件开发环境:  KEIL MDK-ARM V5.26.2.0
    硬件环境:      基于N32G032R8L7_STB开发
3、使用说明
    系统配置;
        1、时钟源:
                    HSE=8M,PLL=48M,AHB=48M,APB1=48M,APB2=48M,TIM1 CLK=48M,DMA CLK=48M
        2、端口配置:
                PA4选择为TIM1   CH1输出
                PB3选择为TIM1   CH2输出
                PA5选择为TIM1   CH3输出
                PB11选择为TIM1  CH4输出
                PA0选择为TIM8   CH1输出
                PA1选择为TIM8   CH2输出
                PA2选择为TIM8   CH3输出
                PB1选择为TIM8   CH4输出
                 
        3、TIM:
                    TIM1 TIM8循环触发DMA传输
        4、DMA:
                    DMA1_CH1~8通道回环模式搬运3个半字 Buffer[3]变量到TIM1 CC1~4  TIM8 CC1~4寄存器
    使用方法:
        1、编译后打开调试模式,用示波器或者逻辑分析仪观察TIM1~8 CH的波形
        2、TIM1 TIM8循环周期改变占空比,循环改变

/****************************************************************************** Copyright (c) 2019, Nations Technologies Inc.** All rights reserved.* ****************************************************************************** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions are met:** - Redistributions of source code must retain the above copyright notice,* this list of conditions and the disclaimer below.** Nations' name may not be used to endorse or promote products derived from* this software without specific prior written permission.** DISCLAIMER: THIS SOFTWARE IS PROVIDED BY NATIONS "AS IS" AND ANY EXPRESS OR* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE* DISCLAIMED. IN NO EVENT SHALL NATIONS BE LIABLE FOR ANY DIRECT, INDIRECT,* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.* ****************************************************************************//*** @file main.c* @author Nations Solution Team* @version v1.0.1** @copyright Copyright (c) 2019, Nations Technologies Inc. All rights reserved.*/
#include "main.h"/** @addtogroup TIM_DMA* @{*/#define TIM1_CCR3_Address 0x40012C3CTIM_TimeBaseInitType TIM_TimeBaseStructure;
OCInitType TIM_OCInitStructure;uint16_t Left_Large_Buffer[3];
uint16_t Left_Middle_Buffer[3];
uint16_t Left_Small_Buffer[3];uint16_t Right_Large_Buffer[3];
uint16_t Right_Middle_Buffer[3];
uint16_t Right_Small_Buffer[3];uint16_t TimerPeriod   = 48;uint16_t CCR1_Val       = 0;
uint16_t CCR2_Val       = 0;
uint16_t CCR3_Val       = 0;
uint16_t CCR4_Val       = 0;
//uint16_t PrescalerValue = 0;void RCC_Configuration(void);
void GPIO_Configuration(void);
void DMA_Configuration(void);/*** @brief  Main program*/
int main(void)
{/* System Clocks Configuration */RCC_Configuration();/* GPIO Configuration */GPIO_Configuration();/* DMA Configuration */DMA_Configuration();  /* -----------------------------------------------------------------------TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles:The TIM3CLK frequency is set to SystemCoreClock (Hz), to get TIM3 counterclock at 24 MHz the Prescaler is computed as following:- Prescaler = (TIM3CLK / TIM3 counter clock) - 1SystemCoreClock is set to 48 MHz for N32G032 deviceThe TIM3 is running at 36 KHz: TIM3 Frequency = TIM3 counter clock/(AR + 1)= 24 MHz / 666 = 36 KHzTIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%----------------------------------------------------------------------- *//* Compute the prescaler value */
//    PrescalerValue = (uint16_t)(SystemCoreClock / 12000000) - 1;/* Time base configuration */Left_Small_Buffer[0] = (uint16_t)(((uint32_t)1 * (TimerPeriod - 1)) / 10);Left_Small_Buffer[1] = (uint16_t)(((uint32_t)2 * (TimerPeriod - 1)) / 10);Left_Small_Buffer[2] = (uint16_t)(((uint32_t)3 * (TimerPeriod - 1)) / 10);Left_Middle_Buffer[0] = (uint16_t)(((uint32_t)4 * (TimerPeriod - 1)) / 10);Left_Middle_Buffer[1] = (uint16_t)(((uint32_t)5 * (TimerPeriod - 1)) / 10);Left_Middle_Buffer[2] = (uint16_t)(((uint32_t)6 * (TimerPeriod - 1)) / 10);Left_Large_Buffer[0] = (uint16_t)(((uint32_t)7 * (TimerPeriod - 1)) / 10);Left_Large_Buffer[1] = (uint16_t)(((uint32_t)8 * (TimerPeriod - 1)) / 10);Left_Large_Buffer[2] = (uint16_t)(((uint32_t)9 * (TimerPeriod - 1)) / 10);      /* TIM1 Peripheral Configuration --------------------------------------------*//* Time Base configuration */TIM_TimeBaseStructure.Prescaler = 0;TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;TIM_TimeBaseStructure.Period    = TimerPeriod - 1;  //72M / 90 = 800K  48M/60 = 800K TimerPeriod;665=18k;TIM_TimeBaseStructure.ClkDiv    = 0;TIM_TimeBaseStructure.RepetCnt  = 0;TIM_InitTimeBase(TIM1, &TIM_TimeBaseStructure);/* Channel 3 Configuration in PWM mode */TIM_OCInitStructure.OcMode       = TIM_OCMODE_PWM2;TIM_OCInitStructure.OutputState  = TIM_OUTPUT_STATE_ENABLE;TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;TIM_OCInitStructure.Pulse        = Left_Small_Buffer[0]; //CCR1_Val;TIM_OCInitStructure.OcPolarity   = TIM_OC_POLARITY_LOW;TIM_OCInitStructure.OcNPolarity  = TIM_OCN_POLARITY_LOW;TIM_OCInitStructure.OcIdleState  = TIM_OC_IDLE_STATE_SET;TIM_OCInitStructure.OcNIdleState = TIM_OC_IDLE_STATE_RESET;TIM_InitOc1(TIM1, &TIM_OCInitStructure);/* TIM1 TIM_DMA_CC1 DMA Request enable */TIM_EnableDma(TIM1, TIM_DMA_CC1, ENABLE);/* PWM1 Mode configuration: Channel2 */TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;TIM_OCInitStructure.Pulse       = Left_Middle_Buffer[0];//CCR2_Val;TIM_InitOc2(TIM1, &TIM_OCInitStructure);TIM_EnableDma(TIM1, TIM_DMA_CC2, ENABLE);/* PWM1 Mode configuration: Channel3 */TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;TIM_OCInitStructure.Pulse       = Left_Large_Buffer[0]; //CCR3_Val;TIM_InitOc3(TIM1, &TIM_OCInitStructure);TIM_EnableDma(TIM1, TIM_DMA_CC3, ENABLE);/* PWM1 Mode configuration: Channel4 */TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;TIM_OCInitStructure.Pulse       = Left_Large_Buffer[0]; //CCR3_Val;TIM_InitOc4(TIM1, &TIM_OCInitStructure);TIM_EnableDma(TIM1, TIM_DMA_CC4, ENABLE);/* Main Output Enable */TIM_EnableCtrlPwmOutputs(TIM1, ENABLE);///* TIM1 enable counter */TIM_Enable(TIM1, ENABLE);/
#if 1/* TIM8 Peripheral Configuration --------------------------------------------*//* Time Base configuration */TIM_TimeBaseStructure.Prescaler = 0;TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;TIM_TimeBaseStructure.Period    = TimerPeriod - 1;  //72M / 90 = 800K  48M/60 = 800K TimerPeriod;665=18k;TIM_TimeBaseStructure.ClkDiv    = 0;TIM_TimeBaseStructure.RepetCnt  = 0;TIM_InitTimeBase(TIM8, &TIM_TimeBaseStructure);/* Channel 3 Configuration in PWM mode */TIM_OCInitStructure.OcMode       = TIM_OCMODE_PWM2;TIM_OCInitStructure.OutputState  = TIM_OUTPUT_STATE_ENABLE;TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;TIM_OCInitStructure.Pulse        = Left_Small_Buffer[0]; //CCR1_Val;TIM_OCInitStructure.OcPolarity   = TIM_OC_POLARITY_LOW;TIM_OCInitStructure.OcNPolarity  = TIM_OCN_POLARITY_LOW;TIM_OCInitStructure.OcIdleState  = TIM_OC_IDLE_STATE_SET;TIM_OCInitStructure.OcNIdleState = TIM_OC_IDLE_STATE_RESET;TIM_InitOc1(TIM8, &TIM_OCInitStructure);/* TIM8 TIM_DMA_CC1 DMA Request enable */TIM_EnableDma(TIM8, TIM_DMA_CC1, ENABLE);/* PWM1 Mode configuration: Channel2 */TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;TIM_OCInitStructure.Pulse       = Left_Middle_Buffer[0];//CCR2_Val;TIM_InitOc2(TIM8, &TIM_OCInitStructure);TIM_EnableDma(TIM8, TIM_DMA_CC2, ENABLE);      /* PWM1 Mode configuration: Channel3 */TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;TIM_OCInitStructure.Pulse       = Left_Large_Buffer[0]; //CCR3_Val;TIM_InitOc3(TIM8, &TIM_OCInitStructure);TIM_EnableDma(TIM8, TIM_DMA_CC3, ENABLE);/* PWM1 Mode configuration: Channel4 */TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;TIM_OCInitStructure.Pulse       = Left_Large_Buffer[0]; //CCR3_Val;TIM_InitOc4(TIM8, &TIM_OCInitStructure);TIM_EnableDma(TIM8, TIM_DMA_CC4, ENABLE);      /* Main Output Enable */TIM_EnableCtrlPwmOutputs(TIM8, ENABLE);///* TIM8 enable counter */TIM_Enable(TIM8, ENABLE);/
#endif      while (1){}
}/*** @brief  Configures the DMA.*/
void DMA_Configuration(void)
{DMA_InitType DMA_InitStructure;
//TIM1-DMA////* DMA Channel1 Config */DMA_DeInit(DMA_CH1);DMA_InitStructure.PeriphAddr     = (uint32_t)&TIM1->CCDAT1;  //TIM1_CCR_Address;DMA_InitStructure.MemAddr        = (uint32_t)Left_Small_Buffer;DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;DMA_InitStructure.BufSize        = 3;DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;//DMA_MODE_CIRCULAR;DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;DMA_Init(DMA_CH1, &DMA_InitStructure);DMA_RequestRemap(DMA_REMAP_TIM1_CH1, DMA, DMA_CH1, ENABLE);  //DMA_REMAP_TIM1_UP DMA_REMAP_TIM1_CH1/* DMA Channel2 Config */DMA_DeInit(DMA_CH2);DMA_InitStructure.PeriphAddr     = (uint32_t)&TIM1->CCDAT2;  //TIM1_CCR_Address;DMA_InitStructure.MemAddr        = (uint32_t)Left_Middle_Buffer;DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;DMA_InitStructure.BufSize        = 3;DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;//DMA_MODE_CIRCULAR;DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;DMA_Init(DMA_CH2, &DMA_InitStructure);DMA_RequestRemap(DMA_REMAP_TIM1_CH2, DMA, DMA_CH2, ENABLE);/* DMA Channel3 Config */DMA_DeInit(DMA_CH3);DMA_InitStructure.PeriphAddr     = (uint32_t)&TIM1->CCDAT3;  //TIM1_CCR_Address;DMA_InitStructure.MemAddr        = (uint32_t)Left_Large_Buffer;DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;DMA_InitStructure.BufSize        = 3;DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;//DMA_MODE_CIRCULAR;DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;DMA_Init(DMA_CH3, &DMA_InitStructure);DMA_RequestRemap(DMA_REMAP_TIM1_CH3, DMA, DMA_CH3, ENABLE); //DMA_REMAP_TIM1_UP/* DMA Channel4 Config */DMA_DeInit(DMA_CH4);DMA_InitStructure.PeriphAddr     = (uint32_t)&TIM1->CCDAT4;  //TIM1_CCR_Address;DMA_InitStructure.MemAddr        = (uint32_t)Left_Large_Buffer;DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;DMA_InitStructure.BufSize        = 3;DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;//DMA_MODE_CIRCULAR;DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;DMA_Init(DMA_CH4, &DMA_InitStructure);DMA_RequestRemap(DMA_REMAP_TIM1_CH4, DMA, DMA_CH4, ENABLE); //DMA_REMAP_TIM1_UP/* DMA Channel1 enable */DMA_EnableChannel(DMA_CH1, ENABLE);/* DMA Channel2 enable */DMA_EnableChannel(DMA_CH2, ENABLE);/* DMA Channel3 enable */DMA_EnableChannel(DMA_CH3, ENABLE);/* DMA Channel4 enable */DMA_EnableChannel(DMA_CH4, ENABLE);/TIM8-DMA//* DMA Channel1 Config */DMA_DeInit(DMA_CH5);DMA_InitStructure.PeriphAddr     = (uint32_t)&TIM8->CCDAT1;  //TIM1_CCR_Address;DMA_InitStructure.MemAddr        = (uint32_t)Left_Small_Buffer;DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;DMA_InitStructure.BufSize        = 3;DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;//DMA_MODE_CIRCULAR;DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;DMA_Init(DMA_CH5, &DMA_InitStructure);DMA_RequestRemap(DMA_REMAP_TIM8_CH1, DMA, DMA_CH5, ENABLE);  //DMA_REMAP_TIM1_UP DMA_REMAP_TIM1_CH1/* DMA Channel2 Config */DMA_DeInit(DMA_CH6);DMA_InitStructure.PeriphAddr     = (uint32_t)&TIM8->CCDAT2;  //TIM1_CCR_Address;DMA_InitStructure.MemAddr        = (uint32_t)Left_Middle_Buffer;DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;DMA_InitStructure.BufSize        = 3;DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;//DMA_MODE_CIRCULAR;DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;DMA_Init(DMA_CH6, &DMA_InitStructure);DMA_RequestRemap(DMA_REMAP_TIM8_CH2, DMA, DMA_CH6, ENABLE);/* DMA Channel3 Config */DMA_DeInit(DMA_CH7);DMA_InitStructure.PeriphAddr     = (uint32_t)&TIM8->CCDAT3;  //TIM1_CCR_Address;DMA_InitStructure.MemAddr        = (uint32_t)Left_Large_Buffer;DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;DMA_InitStructure.BufSize        = 3;DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;//DMA_MODE_CIRCULAR;DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;DMA_Init(DMA_CH7, &DMA_InitStructure);DMA_RequestRemap(DMA_REMAP_TIM8_CH3, DMA, DMA_CH7, ENABLE); //DMA_REMAP_TIM1_UP/* DMA Channel4 Config */DMA_DeInit(DMA_CH8);DMA_InitStructure.PeriphAddr     = (uint32_t)&TIM8->CCDAT4;  //TIM1_CCR_Address;DMA_InitStructure.MemAddr        = (uint32_t)Left_Large_Buffer;DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;DMA_InitStructure.BufSize        = 3;DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_HALFWORD;DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;//DMA_MODE_CIRCULAR;DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;DMA_Init(DMA_CH8, &DMA_InitStructure);DMA_RequestRemap(DMA_REMAP_TIM8_CH4, DMA, DMA_CH8, ENABLE); //DMA_REMAP_TIM1_UP/* DMA Channel1 enable */DMA_EnableChannel(DMA_CH5, ENABLE);/* DMA Channel2 enable */DMA_EnableChannel(DMA_CH6, ENABLE);/* DMA Channel3 enable */DMA_EnableChannel(DMA_CH7, ENABLE);/* DMA Channel4 enable */DMA_EnableChannel(DMA_CH8, ENABLE);
}/*** @brief  Configures the different system clocks.*/
void RCC_Configuration(void)
{/* TIM1 clock enable */RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM1, ENABLE);/* TIM8 clock enable */RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM8, ENABLE);/* GPIOA and GPIOB clock enable */RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_GPIOB | RCC_APB2_PERIPH_AFIO,   ENABLE);/* DMA clock enable */RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA, ENABLE);
}/*** @brief  Configure the TIM1 Pins.*/
void GPIO_Configuration(void)
{GPIO_InitType GPIO_InitStructure;
TIM1GPIO_InitStruct(&GPIO_InitStructure);/* GPIOA Configuration: Channel 1 as alternate function push-pull */GPIO_InitStructure.Pin        = GPIO_PIN_4;GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW;GPIO_InitStructure.GPIO_Alternate = GPIO_AF3_TIM1;GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);/* GPIOA Configuration: Channel 2 as alternate function push-pull */GPIO_InitStructure.Pin        = GPIO_PIN_3;GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW;GPIO_InitStructure.GPIO_Alternate = GPIO_AF3_TIM1;GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);/* GPIOA Configuration: Channel 3 as alternate function push-pull */GPIO_InitStructure.Pin        = GPIO_PIN_5;GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW;GPIO_InitStructure.GPIO_Alternate = GPIO_AF3_TIM1;GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);/* GPIOA Configuration: Channel 4 as alternate function push-pull */GPIO_InitStructure.Pin        = GPIO_PIN_11;GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW;GPIO_InitStructure.GPIO_Alternate = GPIO_AF2_TIM1;GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);TIM8GPIO_InitStruct(&GPIO_InitStructure);/* GPIOA Configuration: Channel 1 as alternate function push-pull */GPIO_InitStructure.Pin        = GPIO_PIN_0;GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW;GPIO_InitStructure.GPIO_Alternate = GPIO_AF3_TIM8;GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);/* GPIOA Configuration: Channel 2 as alternate function push-pull */GPIO_InitStructure.Pin        = GPIO_PIN_1;GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW;GPIO_InitStructure.GPIO_Alternate = GPIO_AF2_TIM8;GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);/* GPIOA Configuration: Channel 3 as alternate function push-pull */GPIO_InitStructure.Pin        = GPIO_PIN_2;GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW;GPIO_InitStructure.GPIO_Alternate = GPIO_AF2_TIM8;GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);/* GPIOA Configuration: Channel 4 as alternate function push-pull */GPIO_InitStructure.Pin        = GPIO_PIN_1;GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW;GPIO_InitStructure.GPIO_Alternate = GPIO_AF9_TIM8;GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);}#ifdef USE_FULL_ASSERT/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param file pointer to the source file name* @param line assert_param error line source number*/
void assert_failed(const uint8_t* expr, const uint8_t* file, uint32_t line)
{/* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */while (1){}
}#endif/*** @}*//*** @}*/

国民技术N32G032 PWM+DMA 8路输出相关推荐

  1. 国民技术 N32G031F8S7 PWM+DMA 控制 WS2812

    一.技术背景 之前移植使用STM32来做MCU,但是这两年STM32离谱的价格和供货情况直接劝退大部分互联网企业.国产的MCU厂家也抓住机会,迅猛抢占市场,国民技术是较为典型的一个厂家. 在很多时候, ...

  2. stm32h7高速通信_【STM32H7教程】第75章 STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)...

    第75章       STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V) 本章节为大家讲解标准SPI接线方式驱动模数转换器DAC8501,制作了中断和DMA两种 ...

  3. WS2812B彩灯 STM32HAL库开发:PWM+DMA(stm32f103c8t6)

    目录 一.摘要 二.WS2812B介绍 三.CUBEMX配置 四.程序介绍(KEIL编译器) 五.数据手册 一.摘要 1.本文使用示例单片机型号为stm32f103c8t6,RGB型号为WS2812B ...

  4. 借WS2812 PWM DMA驱动调试浅谈STM32调试思路

    借WS2812 PWM DMA驱动调试浅谈STM32调试思路 ​ 接触STM32差不多有4年了,在学校参加比赛时也需要进行各种调试工作,团队的配合也需要个人具有领域内快速定位与解决BUG的能力,前些日 ...

  5. STM32 HAL WS2812B PWM+DMA控制

    目录 1.配置PWM+DMA 2.占空比设置 由上图可知 T0H+T0L 和 T1H+T1L 的时间周期为 800ns ~ 1380ns 取一个中间值 1.25us 那么0码/1码的周期就是 1s / ...

  6. STM32F427库函数PWM+DMA控制ws2812b灯带

    STM32F427IIHx库函数PWM+DMA控制ws2812b灯带 一.参考资料 查看ws2812b用户手册可知: 二.代码部分 添加文件ws2812b.c,ws2812b.h 配置的F427IIH ...

  7. 【STM32F4系列】【HAL库】【自制库】WS2812(软件部分)(PWM+DMA)

    文章目录 相关链接 协议 外设设置 硬件PWM 分析 HAL设置 DMA 分析 HAL设置 方案设计 代码实现 解码函数 开始发送和复位 发送函数 波形 成品 相关链接 硬件介绍(PCB设计方案) 模 ...

  8. 【STM32F429开发板用户手册】第34章 STM32F429的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第34章       STM32F429的SPI总线应用之驱动DA ...

  9. 量产150W 双路输出开关电源全套设计生产资料, 输入220VAC,输出24V5A+5V2A,,PCB及原理图使用AD设计

    量产150W 双路输出开关电源全套设计生产资料, 输入220VAC,输出24V5A+5V2A,PCB及原理图使用AD设计,pcb使用元件带3D模型, 采用NE1118B作为PWM控制IC, 单路24V ...

最新文章

  1. 神经网络AI加速器技术
  2. Visial Studio 2019提示:namespace std 没有成员 max 的解决方法
  3. Python输出py文件模拟代码高亮
  4. 语音识别(一):speech-recognition的实验案例
  5. koa --- [MVC实现之二]Controller层的实现
  6. 同为程序员 为什么我的工资最低
  7. Golang的GC和内存逃逸
  8. 20非常有用的Java程序片段(1)
  9. Ubuntu22.04运行网易云音乐错误
  10. 第3关:HTML表格:日常消费账单表格展示网页
  11. win7系统声卡驱动安装失败怎么办--win7w.com
  12. “反悔”贪心 烤鸡翅
  13. 60后刘备聘用80后诸葛亮的启示
  14. Linux 启动项管理
  15. 开发框架-.Net:Learun(力软敏捷开发)
  16. 打印机经常没反应的一个解决办法
  17. ipad上编程方法,服务器安装vscode
  18. 计算机 优质课教案,5.3正弦函数的性质优质课一等奖教案
  19. jq轮播图——无缝轮播
  20. 我用Python写自动刷代理服务IP的经过

热门文章

  1. 【android studio学习】——常见布局
  2. html个性相册,个性相册名
  3. 003基于SSM网上服装商城
  4. python小游戏 塔防小游戏设计与实现
  5. 经纬度距离和直角坐标距离转换
  6. 网络安全设备默认密码
  7. 极坐标t1t2几何意义_高中数学知识点复习资料归纳整理:参数方程、极坐标
  8. 近期所有的面试题大全
  9. 金属材料行业的ERP亮点分享
  10. 2005年10月21日  日本,东京  晴朗