MSP432P401R TI Drivers 库函数学习笔记(五)PWM

平台:Code Composer Studio 10.4.0
MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件
(MSP-EXP432P401R)


API (机翻)

PWM API 官方手册

函数

void 	PWM_close (PWM_Handle handle)
函数关闭由PWM句柄指定的PWM实例
 
int_fast16_t 	PWM_control (PWM_Handle handle, uint_fast16_t cmd, void *arg)
函数在给定的PWM_Handle上执行特定的实现特性
 
void 	PWM_init (void)
这个函数初始化PWM模块
 
PWM_Handle 	PWM_open (uint_least8_t index, PWM_Params *params)
这个函数打开一个给定的PWM实例,并将周期、负载和空闲电平设置为params参数中指定的值
 
void 	PWM_Params_init (PWM_Params *params)
函数将PWM_Params结构初始化为默认值
 
int_fast16_t 	PWM_setDuty (PWM_Handle handle, uint32_t duty)
命令功能设置指定PWM句柄的占空比。PWM实例在主动高电平输出模式(非开漏)下运行;
0%代表低电平,100%代表高电平。这个API可以被调用,而PWM正在运行&负载必须总是
低于或等于周期。如果调用该函数时发生错误,PWM占空比将保持不变
 
int_fast16_t 	PWM_setPeriod (PWM_Handle handle, uint32_t period)
设置指定PWM句柄的周期。这个API可以在PWM运行时调用。周期必须总是大于等于占空比。
如果调用该函数时发生错误,PWM周期将保持不变
 
int_fast16_t 	PWM_setDutyAndPeriod (PWM_Handle handle, uint32_t duty, uint32_t period)
设置指定PWM句柄的周期和占空比。这个API必须在PWM运行时调用。周期必须总是大于占空比。
如果在调用函数时发生错误,周期和占空比将保持不变
 
void 	PWM_start (PWM_Handle handle)
以当前设置启动指定的PWM句柄
 
void 	PWM_stop (PWM_Handle handle)
能停止指定的PWM句柄。输出将被设置为PWM_open()中的参数指定的空闲级别

上机实战

配置引脚

LED1,用于指示单片机正常工作
在这里插入图片描述
PWM输出引脚
在这里插入图片描述

PWM初始化,实现简易呼吸灯的效果

/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)
{
	float LED2_G_Duty = 0;
	int8_t LED2_DIR = 1;

	My_Task_Init(LED_Task, 1, 1024);

	My_PWM_Hz_Init(&hpwm1, PWM_1, 1000);

    while(1)
    {
    	if(LED2_G_Duty >= 100)
    		LED2_DIR = -1;
    	else if(LED2_G_Duty <= 0)
    		LED2_DIR = 1;
    	LED2_G_Duty += LED2_DIR * 0.5;
    	if(LED2_G_Duty < 0)
    		LED2_G_Duty = 0;
    	else if(LED2_G_Duty > 100)
    		LED2_G_Duty = 100;
    	My_PWM_setDuty(&hpwm1, LED2_G_Duty);
    	usleep(1000);
    }
}

实验结果

在这里插入图片描述

完整代码

myPWM.c

/*
 * myPWM.c
 *
 *  Created on: 2021年8月2日
 *      Author: Royic
 */
// Import PWM Driver definitions

#include "./inc/myPWM.h"

PWM_Handle hpwm1;

void My_PWM_Hz_Init(PWM_Handle *hpwm, uint_least8_t index, uint32_t Frequency)
{
	PWM_Params pwmParams;

    // Initialize the PWM driver.
    PWM_init();
	// Initialize the PWM parameters
	PWM_Params_init(&pwmParams);
	pwmParams.idleLevel = PWM_IDLE_LOW;			// Output low when PWM is not running
	pwmParams.periodUnits = PWM_PERIOD_HZ;		// Period is in Hz
	pwmParams.periodValue = Frequency;			// Frequency Hz
	pwmParams.dutyUnits = PWM_DUTY_FRACTION;	// Duty is in fractional percentage
	pwmParams.dutyValue = 0;					// 0% initial duty cycle
	// Open the PWM instance
	*hpwm = PWM_open(index, &pwmParams);
	if (*hpwm == NULL)
	{
	    // PWM_open() failed
	    while (1);
	}
	PWM_start(*hpwm);				// start PWM with 0% duty cycle
}

inline void My_PWM_setDuty(PWM_Handle *hpwm, float Percentage)
{
	PWM_setDuty(*hpwm, (uint32_t) (PWM_DUTY_FRACTION_MAX / 100. * Percentage));	// set duty cycle to Duty_Cycle%
}

myPWM.h

/*
 * myTask.h
 *
 *  Created on: 2021年8月2日
 *      Author: Royic
 */

#ifndef INC_MYTASK_H_
#define INC_MYTASK_H_

#include "./inc/main.h"

void *mainThread(void *arg0);
void My_Task_Init(void *(*startroutine)(void *), int priority, size_t stacksize);

void *LED_Task(void *arg0);

#endif /* INC_MYTASK_H_ */

myTask.c

/*
 * myTask.c
 *
 *  Created on: 2021年8月2日
 *      Author: Royic
 */

/* POSIX Header files */
#include <pthread.h>

/* RTOS header files */
#include <ti/sysbios/BIOS.h>

#include "./inc/myTask.h"

/* Driver Header files */
#include <ti/drivers/GPIO.h>

void My_Task_Init(void *(*startroutine)(void *), int priority, size_t stacksize)
{
    pthread_t           thread;
    pthread_attr_t      attrs;
    struct sched_param  priParam;
    int                 retc;

    /* Initialize the attributes structure with default values */
    pthread_attr_init(&attrs);

    /* Set priority, detach state, and stack size attributes */
    priParam.sched_priority = priority;
    retc = pthread_attr_setschedparam(&attrs, &priParam);
    retc |= pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
    retc |= pthread_attr_setstacksize(&attrs, stacksize);
    if (retc != 0)
    {
        /* failed to set attributes */
        while (1)
        {

        }
    }

    retc = pthread_create(&thread, &attrs, startroutine, NULL);
    if (retc != 0)
    {
        /* pthread_create() failed */
        while (1)
        {

        }
    }
}

void *LED_Task(void *arg0)
{
	while(1)
	{
		GPIO_toggle(LED1);
		sleep(1);
	}
}


myTask.h

/*
 * myTask.h
 *
 *  Created on: 2021年8月2日
 *      Author: Royic
 */

#ifndef INC_MYTASK_H_
#define INC_MYTASK_H_

#include "./inc/main.h"

void *mainThread(void *arg0);
void My_Task_Init(void *(*startroutine)(void *), int priority, size_t stacksize);

void *LED_Task(void *arg0);

#endif /* INC_MYTASK_H_ */

main.c

/*
 *  ======== main_tirtos.c ========
 */

#include "./inc/main.h"

/* POSIX Header files */
#include <pthread.h>

/* RTOS header files */
#include <ti/sysbios/BIOS.h>

/* Driver configuration */
#include <ti/drivers/Board.h>
#include <ti/drivers/GPIO.h>

#include "./inc/myTask.h"

#include "./inc/myPWM.h"

/*
 *  ======== main ========
 */
int main(void)
{
    /* Call driver init functions */
    Board_init();
    GPIO_init();

    My_Task_Init(mainThread, 1, 1024);

    BIOS_start();

    return (0);
}

/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)
{
	float LED2_G_Duty = 0;
	int8_t LED2_DIR = 1;

	My_Task_Init(LED_Task, 1, 1024);

	My_PWM_Hz_Init(&hpwm1, PWM_1, 1000);

    while(1)
    {
    	if(LED2_G_Duty >= 100)
    		LED2_DIR = -1;
    	else if(LED2_G_Duty <= 0)
    		LED2_DIR = 1;
    	LED2_G_Duty += LED2_DIR * 0.5;
    	if(LED2_G_Duty < 0)
    		LED2_G_Duty = 0;
    	else if(LED2_G_Duty > 100)
    		LED2_G_Duty = 100;
    	My_PWM_setDuty(&hpwm1, LED2_G_Duty);
    	usleep(1000);
    }
}

main.h

/*
 * main.h
 *
 *  Created on: 2021年8月2日
 *      Author: Royic
 */

#ifndef INC_MAIN_H_
#define INC_MAIN_H_

/* For usleep() */
#include <unistd.h>
#include <stdint.h>
#include <stddef.h>

/* Driver configuration */
#include "ti_drivers_config.h"

#endif /* INC_MAIN_H_ */

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
MSP432P401R 是德州仪器(TI)公司推出的一款低功耗高性能微控制器,它采用了ARM Cortex-M4F内核,拥有高性能、低功耗、可扩展性等特点。MSP432P401R库函数是针对该微控制器开发的一种软件库,它提供了一系列的函数,用于简化开发人员在MSP432P401R上编写软件的过程。 MSP432P401R库函数主要包括以下几类: 1. GPIO库函数:用于配置和控制MSP432P401R的GPIO引脚,包括输入/输出配置、中断配置、电气特性配置等。 2. Timer库函数:用于配置和控制MSP432P401R的定时器,包括计数器模式、PWM模式、定时器中断等。 3. UART库函数:用于配置和控制MSP432P401R的串口通信,包括波特率配置、数据位配置、停止位配置、奇偶校验配置等。 4. ADC库函数:用于配置和控制MSP432P401R的模数转换器,包括采样周期配置、参考电压配置、分辨率配置等。 5. DMA库函数:用于配置和控制MSP432P401R的DMA控制器,包括通道配置、传输类型配置、传输大小配置等。 6. Interrupt库函数:用于配置和控制MSP432P401R的中断,包括中断优先级配置、中断使能配置、中断处理函数配置等。 7. Flash库函数:用于配置和控制MSP432P401R的Flash存储器,包括擦除、编程、读取等操作。 8. Clock库函数:用于配置和控制MSP432P401R的时钟,包括系统时钟配置、外设时钟配置、时钟源配置等。 以上是MSP432P401R库函数的主要类别,除此之外还有一些其他的库函数,如PWM库函数、SPI库函数、I2C库函数等。这些库函数可以大大简化开发人员在MSP432P401R上编写软件的工作量,提高开发效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乙酸氧铍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值