本篇文章包含的内容
笔者学习采用单片机型号为MSP430F5529,使用MSP-EXP430F5529LP开发板。
一、MSP430的GPIO
1.1 MSP430的GPIO简介
1.2 MSP430的GPIO库函数
GPIO配置与操作:
extern void GPIO_setAsOutputPin(uint8_t selectedPort, uint16_t selectedPins); // 设置为GPIO输出
extern void GPIO_setAsInputPin(uint8_t selectedPort, uint16_t selectedPins); // 设置为GPIO输入
extern void GPIO_setOutputHighOnPin(uint8_t selectedPort, uint16_t selectedPins); // 高电位输出
extern void GPIO_setOutputLowOnPin(uint8_t selectedPort, uint16_t selectedPins); // 低电位输出
extern void GPIO_toggleOutputOnPin(uint8_t selectedPort, uint16_t selectedPins); // 翻转电位
extern void GPIO_setAsInputPinWithPullDownResistor(uint8_t selectedPort, uint16_t selectedPins) // 下拉电阻输入模式
extern void GPIO_setAsInputPinWithPullUpResistor(uint8_t selectedPort, uint16_t selectedPins); // 上拉电阻输入模式
extern void GPIO_setAsPeripheralModuleFunctionOutputPin(uint8_t selectedPort, uint16_t selectedPins); // 配置输出外围模块(例如设置PWM)
extern void GPIO_setAsPeripheralModuleFunctionInputPin (uint8_t selectedPort, uint16_t selectedPins); // 配置输入外围模块
extern uint8_t GPIO_getInputPinValue(uint8_t selectedPort, uint16_t selectedPins); // 获取引脚上的输入值
GPIO中断配置与操作:
extern void GPIO_enableInterrupt(uint8_t selectedPort, uint16_t selectedPins); // 启用引脚上的中断
extern void GPIO_disableInterrupt(uint8_t selectedPort, uint16_t selectedPins); // 禁用中断
extern uint16_t GPIO_getInterruptStatus(uint8_t selectedPort, uint16_t selectedPins); // 获取引脚中断状态
extern void GPIO_clearInterrupt(uint8_t selectedPort, uint16_t selectedPins); // 清除中断标志
extern void GPIO_selectInterruptEdge(uint8_t selectedPort, uint16_t selectedPins, uint8_t edgeSelect); // 设置一个中断标志为转换边缘
extern void GPIO_setDriveStrength(uint8_t selectedPort, uint16_t selectedPins, uint8_t driveStrength); //设置端口的驱动器强度
二、MSP430的中断系统和GPIO中断
2.1 MSP430的中断系统
中断分为可屏蔽中断和不可屏蔽中断。MSP430的中断系统包含以下部分:
- GPIO中断
- 定时器中断
- 串口中断
- 外部中断
- ADC转换中断
- 看门狗中断
- 捕获比较中断
- …
2.2 常用库函数
GPIO中断配置与操作(与上文相同):
extern void GPIO_enableInterrupt(uint8_t selectedPort, uint16_t selectedPins); // 启用引脚上的中断
extern void GPIO_disableInterrupt(uint8_t selectedPort, uint16_t selectedPins); // 禁用中断
extern uint16_t GPIO_getInterruptStatus(uint8_t selectedPort, uint16_t selectedPins); // 获取引脚中断状态
extern void GPIO_clearInterrupt(uint8_t selectedPort, uint16_t selectedPins); // 清除中断标志
extern void GPIO_selectInterruptEdge(uint8_t selectedPort, uint16_t selectedPins, uint8_t edgeSelect); // 设置一个中断标志为转换边缘
extern void GPIO_setDriveStrength(uint8_t selectedPort, uint16_t selectedPins, uint8_t driveStrength); //设置端口的驱动器强度
三、使用示例
下面的程序实现LED1以1Hz的频率闪烁,按下S2可以更改LED2的亮灭状态(按下更改亮灭状态,无消抖)。
#include <driverlib.h>
void Delay_ms(int x_ms)
{
while (x_ms--)
{
__delay_cycles(1000);
}
}
/**
* main.c
*/
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1); // 设置P1.1为上拉输入模式
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN7); // 设置P4.7为输出模式
_EINT(); // 开启全局中断使能
GPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN1, GPIO_HIGH_TO_LOW_TRANSITION);
GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1); // 允许P1.1引脚中断
while (1)
{
GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0); // 点亮P1.0
Delay_ms(500);
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0); // 熄灭P1.0
Delay_ms(500);
}
}
#pragma vector = PORT1_VECTOR;
__interrupt void Port1_interrupt_process(void)
{
_DINT(); // 关闭全局中断
if (GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN1) == GPIO_PIN1);
{
GPIO_toggleOutputOnPin(GPIO_PORT_P4, GPIO_PIN7);
}
GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN1);
_EINT(); // 开启全局中断
}
持续更新完善中……
原创笔记,码字不易,欢迎点赞,收藏~ 如有谬误敬请在评论区不吝告知,感激不尽!博主将持续更新有关嵌入式开发、机器学习方面的学习笔记~