ARM嵌入式学习日记(5)

PWM输出实验

直接上干货,懒得介绍了.......

杀了我算了,当时在y点上面乱改,现在补天又要乱改一桶(包能跑的)

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/KEY/key.h"
#include "./BSP/TIMER/atim.h"


int main(void)
{
    uint8_t key = 0;
    uint8_t t = 0;
    GPIO_InitTypeDef gpio_init_struct;

    HAL_Init();                         /* ³õʼ»¯HAL¿â */
    sys_stm32_clock_init(RCC_PLL_MUL9); /* ÉèÖÃʱÖÓ, 72Mhz */
    delay_init(72);                     /* ÑÓʱ³õʼ»¯ */
    usart_init(115200);                 /* ´®¿Ú³õʼ»¯Îª115200 */
    led_init();                         /* ³õʼ»¯LED */
    key_init();                         /* ³õʼ»¯°´¼ü */

    /* ½« LED1 Òý½ÅÉèÖÃΪÊäÈëģʽ, ±ÜÃâºÍPC6³åÍ» */
    gpio_init_struct.Pin = LED1_GPIO_PIN;                   /* LED1Òý½Å */
    gpio_init_struct.Mode = GPIO_MODE_INPUT;                /* ÉèÖÃΪÊäÈë */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* ÉÏÀ­ */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;
    HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct);       /* ³õʼ»¯LED1Òý½Å */

    atim_timx_npwm_chy_init(5000 - 1, 7200 - 1);            /* 10KhzµÄ¼ÆÊýƵÂÊ,2hzµÄPWMƵÂÊ. */

    ATIM_TIMX_NPWM_CHY_CCRX = 2500; /* ÉèÖÃPWMÕ¼¿Õ±È,50%,ÕâÑù¿ÉÒÔ¿ØÖÆÿһ¸öPWMÖÜÆÚ,LED1(BLUE)
                                     * ÓÐÒ»°ëʱ¼äÊÇÁÁµÄ,Ò»°ëʱ¼äÊÇÃðµÄ,LED1ÁÁÃðÒ»´Î,±íʾһ¸öPWM²¨
                                     */
    atim_timx_npwm_chy_set(5);      /* Êä³ö5¸öPWM²¨(¿ØÖÆLED1(BLUE)ÉÁ˸5´Î) */

    while (1)
    {
        key = key_scan(0);

        if (key == KEY0_PRES)           /* KEY0°´ÏÂ */
        {
            atim_timx_npwm_chy_set(5); /* Êä³ö5¸öPWM²¨(¿ØÖÆTIM8_CH1, ¼´PC6Êä³ö5¸öÂö³å) */
        }

        t++;
        delay_ms(10);

        if (t > 50)                   /* ¿ØÖÆLED0ÉÁ˸, Ìáʾ³ÌÐòÔËÐÐ״̬ */
        {
            t = 0;
            LED0_TOGGLE();
        }
    }

what can i say

PWM输出代码

#include "./BSP/TIMER/atim.h"
#include "./BSP/LED/led.h"


TIM_HandleTypeDef g_timx_npwm_chy_handle;     /* ¶¨Ê±Æ÷x¾ä±ú */

/* g_npwm_remain±íʾµ±Ç°»¹Ê£Ï¶àÉÙ¸öÂö³åÒª·¢ËÍ
 * ÿ´Î×î¶à·¢ËÍ256¸öÂö³å
 */
static uint32_t g_npwm_remain = 0;

/**
 * @brief       ¸ß¼¶¶¨Ê±Æ÷TIMX ͨµÀY Êä³öÖ¸¶¨¸öÊýPWM ³õʼ»¯º¯Êý
 * @note
 *              ¸ß¼¶¶¨Ê±Æ÷µÄʱÖÓÀ´×ÔAPB2, ¶øPCLK2 = 72Mhz, ÎÒÃÇÉèÖÃPPRE2²»·ÖƵ, Òò´Ë
 *              ¸ß¼¶¶¨Ê±Æ÷ʱÖÓ = 72Mhz
 *              ¶¨Ê±Æ÷Òç³öʱ¼ä¼ÆËã·½·¨: Tout = ((arr + 1) * (psc + 1)) / Ft us.
 *              Ft=¶¨Ê±Æ÷¹¤×÷ƵÂÊ,µ¥Î»:Mhz
 *
 * @param       arr: ×Ô¶¯ÖØ×°Öµ
 * @param       psc: ʱÖÓÔ¤·ÖƵÊý
 * @retval      ÎÞ
 */
void atim_timx_npwm_chy_init(uint16_t arr, uint16_t psc)
{
    GPIO_InitTypeDef gpio_init_struct;
    TIM_OC_InitTypeDef timx_oc_npwm_chy;   /* ¶¨Ê±Æ÷Êä³ö */
    ATIM_TIMX_NPWM_CHY_GPIO_CLK_ENABLE();  /* TIMX ͨµÀIO¿ÚʱÖÓʹÄÜ */
    ATIM_TIMX_NPWM_CHY_CLK_ENABLE();       /* TIMX ʱÖÓʹÄÜ */

    g_timx_npwm_chy_handle.Instance = ATIM_TIMX_NPWM;                  /* ¶¨Ê±Æ÷x */
    g_timx_npwm_chy_handle.Init.Prescaler = psc;                       /* ¶¨Ê±Æ÷·ÖƵ */
    g_timx_npwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;      /* µÝÔö¼ÆÊýģʽ */
    g_timx_npwm_chy_handle.Init.Period = arr;                          /* ×Ô¶¯ÖØ×°ÔØÖµ */
    g_timx_npwm_chy_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /*ʹÄÜTIMx_ARR½øÐлº³å */
    g_timx_npwm_chy_handle.Init.RepetitionCounter = 0;                 /* Öظ´¼ÆÊýÆ÷³õʼֵ */
    HAL_TIM_PWM_Init(&g_timx_npwm_chy_handle);                         /* ³õʼ»¯PWM */

    gpio_init_struct.Pin = ATIM_TIMX_NPWM_CHY_GPIO_PIN;                /* ͨµÀyµÄCPIO¿Ú */
    gpio_init_struct.Mode = GPIO_MODE_AF_PP;                           /* ¸´ÓÃÍÆÍêÊä³ö */
    gpio_init_struct.Pull = GPIO_PULLUP;                               /* ÉÏÀ­ */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;                     /* ¸ßËÙ */
    HAL_GPIO_Init(ATIM_TIMX_NPWM_CHY_GPIO_PORT, &gpio_init_struct);

    timx_oc_npwm_chy.OCMode = TIM_OCMODE_PWM1;                         /* ģʽѡÔñPWM 1*/
    timx_oc_npwm_chy.Pulse = arr / 2;                                  /* ÉèÖñȽÏÖµ,´ËÖµÓÃÀ´È·¶¨Õ¼¿Õ±È */
                                                                       /* ÕâÀïĬÈÏÉèÖñȽÏֵΪ×Ô¶¯ÖØ×°ÔØÖµµÄÒ»°ë,¼´Õ¼¿Õ±ÈΪ50% */
    timx_oc_npwm_chy.OCPolarity = TIM_OCPOLARITY_HIGH;                 /* Êä³ö±È½Ï¼«ÐÔΪ¸ß */
    HAL_TIM_PWM_ConfigChannel(&g_timx_npwm_chy_handle, &timx_oc_npwm_chy, ATIM_TIMX_NPWM_CHY); /* ÅäÖÃTIMxͨµÀy */

    HAL_NVIC_SetPriority(ATIM_TIMX_NPWM_IRQn, 1, 3);                   /* ÉèÖÃÖжÏÓÅÏȼ¶£¬ÇÀÕ¼ÓÅÏȼ¶1£¬×ÓÓÅÏȼ¶3 */
    HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn);                           /* ¿ªÆôITMxÖÐ¶Ï */

    __HAL_TIM_ENABLE_IT(&g_timx_npwm_chy_handle, TIM_IT_UPDATE);       /* ÔÊÐí¸üÐÂÖÐ¶Ï */
    HAL_TIM_PWM_Start(&g_timx_npwm_chy_handle, ATIM_TIMX_NPWM_CHY);    /* ¿ªÆô¶ÔÓ¦PWMͨµÀ */
}

/**
 * @brief       ¸ß¼¶¶¨Ê±Æ÷TIMX NPWMÉèÖÃPWM¸öÊý
 * @param       rcr: PWMµÄ¸öÊý, 1~2^32´Î·½¸ö
 * @retval      ÎÞ
 */
void atim_timx_npwm_chy_set(uint32_t npwm)
{
    if (npwm == 0) return;

    g_npwm_remain = npwm;                                                   /* ±£´æÂö³å¸öÊý */
    HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE); /* ²úÉúÒ»´Î¸üÐÂʼþ,ÔÚÖжÏÀïÃæ´¦ÀíÂö³åÊä³ö */
    __HAL_TIM_ENABLE(&g_timx_npwm_chy_handle);                              /* ʹÄܶ¨Ê±Æ÷TIMX */
}

/**
 * @brief       ¸ß¼¶¶¨Ê±Æ÷TIMX NPWMÖжϷþÎñº¯Êý
 * @param       ÎÞ
 * @retval      ÎÞ
 */
void ATIM_TIMX_NPWM_IRQHandler(void)
{
    uint16_t npwm = 0;

    /* ÒÔÏ´úÂëûÓÐʹÓö¨Ê±Æ÷HAL¿â¹²Óô¦Àíº¯ÊýÀ´´¦Àí£¬¶øÊÇÖ±½Óͨ¹ýÅжÏÖжϱê־λµÄ·½Ê½ */
    if(__HAL_TIM_GET_FLAG(&g_timx_npwm_chy_handle, TIM_FLAG_UPDATE) != RESET)
    {
        if (g_npwm_remain >= 256)           /* »¹ÓдóÓÚ256¸öÂö³åÐèÒª·¢ËÍ */
        {
            g_npwm_remain = g_npwm_remain - 256;
            npwm = 256;
        }
        else if (g_npwm_remain % 256)       /* »¹ÓÐλÊý£¨²»µ½256£©¸öÂö³åÒª·¢ËÍ */
        {
            npwm = g_npwm_remain % 256;
            g_npwm_remain = 0;              /* ûÓÐÂö³åÁË */
        }

        if (npwm) /* ÓÐÂö³åÒª·¢ËÍ */
        {
            ATIM_TIMX_NPWM->RCR = npwm - 1;                                         /* ÉèÖÃÖظ´¼ÆÊý¼Ä´æÆ÷ֵΪnpwm-1, ¼´npwm¸öÂö³å */
            HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE); /* ²úÉúÒ»´Î¸üÐÂʼþ,ÔÚÖжÏÀïÃæ´¦ÀíÂö³åÊä³ö */
            __HAL_TIM_ENABLE(&g_timx_npwm_chy_handle);                              /* ʹÄܶ¨Ê±Æ÷TIMX */
        }
        else
        {
            ATIM_TIMX_NPWM->CR1 &= ~(1 << 0); /* ¹Ø±Õ¶¨Ê±Æ÷TIMX£¬Ê¹ÓÃHAL Disable»áÇå³ýPWMͨµÀÐÅÏ¢£¬´Ë´¦²»Óà */
        }

        __HAL_TIM_CLEAR_IT(&g_timx_npwm_chy_handle, TIM_IT_UPDATE);  /* Çå³ý¶¨Ê±Æ÷Òç³öÖжϱê־λ */
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值