4.PWM
取名
对于配置文件中的一些宏定义:
/* GPIO defines for channel 0 */
#define GPIO_PWM_Test_C0_PORT GPIOA
#define GPIO_PWM_Test_C0_PIN DL_GPIO_PIN_12
#define GPIO_PWM_Test_C0_IOMUX (IOMUX_PINCM34)
#define GPIO_PWM_Test_C0_IOMUX_FUNC IOMUX_PINCM34_PF_TIMG0_CCP0
#define GPIO_PWM_Test_C0_IDX DL_TIMER_CC_0_INDEX
GPIO_PWM_Test_C0_PORT: 定义了用于PWM测试的通道0所使用的GPIO端口,这里是GPIOA。
GPIO_PWM_Test_C0_PIN: 指定了GPIO端口上的具体引脚,这里是DL_GPIO_PIN_12,意味着使用的是GPIOA端口上的第12号引脚。
GPIO_PWM_Test_C0_IOMUX: IOMUX(Input/Output Multiplexer)是指引脚复用功能,它允许同一个物理引脚实现多种不同的功能。这里IOMUX_PINCM34是与GPIOA_12引脚对应的IOMUX编号。
GPIO_PWM_Test_C0_IOMUX_FUNC: 指明了GPIOA_12引脚在IOMUX配置中的具体功能,这里是IOMUX_PINCM34_PF_TIMG0_CCP0,表示该引脚被配置为定时器组0(TIMG0)的捕获比较单元0(CCP0)的输入,用于PWM输出。
GPIO_PWM_Test_C0_IDX: 这个宏定义了定时器的捕获/比较单元的索引,在本例中是DL_TIMER_CC_0_INDEX,意味着这是定时器0的第0个捕获/比较单元。
为了调节PWM的占空比,我们需要用到 DL_TimerA_setCaptureCompareValue()这个函数。它有三个入口参数,第一个为选择哪个定时器,第二个为占空比,第三个为PWM通道索引。
DL_TimerA_setCaptureCompareValue(PWM_10KHZ_INST, 10, DL_TIMER_CC_0_INDEX);
主函数中开启定时器
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init(); // 芯片资源初始化,由SysConfig配置软件自动生成
DL_TimerA_startCounter(PWM_10KHZ_INST);//开始计数
DL_TimerA_startCounter(PWM_50HZ_INST);//开始计数
while(1)
{
Motor(20,40); // 左电机25的速度,右电机50的速度,简洁明了
Servo_Motor(60,80); // 舵机PWM控制
}
}
修改占空比使用
void Motor(uint16_t motor_left_speed, uint16_t motor_right_speed)
{
if ((motor_left_speed > 95) || (motor_right_speed > 95)) // 一定要限制!!!
return; // PWM占空比不允许大于95%,否则就直接退出
DL_TimerA_setCaptureCompareValue(PWM_10KHZ_INST, motor_left_speed * 10, DL_TIMER_CC_0_INDEX);
DL_TimerA_setCaptureCompareValue(PWM_10KHZ_INST, motor_right_speed * 10, DL_TIMER_CC_1_INDEX);
5.串口UART
特殊概念:
UART (Universal Asynchronous Receiver/Transmitter)
UART是一种标准的串行通信协议,用于在两个设备之间传输数据。
UART-LIN (Local Interconnect Network over UART)
UART-LIN则是在UART基础上增加了一套LIN(Local Interconnect Network)协议的支持。LIN是一种轻量级的串行通信协议,主要用于汽车行业的辅助网络中,连接汽车内部的各种传感器、执行器和其他ECU(Electronic Control Unit)
对于配置文件生成的串口相关的宏:
#define UART_0_INST UART0
#define UART_0_INST_IRQHandler UART0_IRQHandler
#define UART_0_INST_INT_IRQN UART0_INT_IRQn
#define GPIO_UART_0_RX_PORT GPIOA
#define GPIO_UART_0_TX_PORT GPIOA
#define GPIO_UART_0_RX_PIN DL_GPIO_PIN_11
#define GPIO_UART_0_TX_PIN DL_GPIO_PIN_10
#define GPIO_UART_0_IOMUX_RX (IOMUX_PINCM22)
#define GPIO_UART_0_IOMUX_TX (IOMUX_PINCM21)
#define GPIO_UART_0_IOMUX_RX_FUNC IOMUX_PINCM22_PF_UART0_RX
#define GPIO_UART_0_IOMUX_TX_FUNC IOMUX_PINCM21_PF_UART0_TX
#define UART_0_BAUD_RATE (9600)
#define UART_0_IBRD_40_MHZ_9600_BAUD (260)
#define UART_0_FBRD_40_MHZ_9600_BAUD (27)
UART_0_INST: 定义了UART_0模块的实例,这里是UART0,这是微控制器上UART模块的硬件标识符。
UART_0_INST_IRQHandler: UART_0的中断服务函数名,当UART_0有中断请求时,处理器将跳转到UART0_IRQHandler这个函数。
UART_0_INST_INT_IRQN: UART_0中断的IRQ(Interrupt Request)编号,这是在中断向量表中的位置,对应于UART0_INT_IRQn
GPIO_UART_0_RX_PORT 和 GPIO_UART_0_TX_PORT: UART_0的接收和发送引脚所在的GPIO端口,都是GPIOA。
GPIO_UART_0_RX_PIN 和 GPIO_UART_0_TX_PIN: 分别定义了接收和发送数据的GPIO引脚编号,分别是DL_GPIO_PIN_11和DL_GPIO_PIN_10。
GPIO_UART_0_IOMUX_RX 和 GPIO_UART_0_IOMUX_TX: 定义了接收和发送引脚的IOMUX(Input/Output Multiplexer,输入/输出多路复用器)设置,用于指定引脚的复用功能。IOMUX_PINCM22_PF_UART0_RX 和 IOMUX_PINCM21_PF_UART0_TX 表示GPIOA_11和GPIOA_10引脚被配置为UART0的RX和TX功能。
UART_0_BAUD_RATE: 设置UART_0的波特率,这里是9600bps。
UART_0_IBRD_40_MHZ_9600_BAUD 和 UART_0_FBRD_40_MHZ_9600_BAUD: 这些宏定义了用于计算波特率的整数部分和分数部分的值。在MSPM0系列微控制器中,UART模块使用IBRD(Integer Baud Rate Divisor,整数波特率除数)和FBRD(Fractional Baud Rate Divisor,小数波特率除数)寄存器来设置波特率。这些值是根据微控制器的时钟频率(这里是40MHz)和期望的波特率(9600bps)计算出来的。
#include "ti_msp_dl_config.h"
char receivedChar;
int main(void)
{
SYSCFG_DL_init();
NVIC_EnableIRQ(UART_0_INST_INT_IRQN); //使能中断
//DL_SYSCTL_enableSleepOnExit();//空闲或任务结束时进入睡眠模式
while(1)
{
}
}
void UART_0_INST_IRQHandler(void)//串口中断处理例程
{
if (DL_UART_Main_getPendingInterrupt(UART_0_INST) == DL_UART_MAIN_IIDX_RX)
{
// 处理接收的字符
receivedChar = DL_UART_Main_receiveData(UART_0_INST);
// 进一步处理接收到的数据
DL_UART_Main_transmitData(UART_0_INST, receivedChar);
}
}
!!!NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);这句一定不能加!!!