引入
接下来的几期博客会介绍轮式平衡机器人TMS320F28069片内外设,了解片内外设的基本原理,内容较为基础,都是些简单的simulink模型,旨在将复杂的原理过渡到simulink软件应用。足够了解的博友可跳过。
后续还将会结合MATLAB/Simulink实现TMS320F28069外设的模型搭建实验环境和自动代码生成。
一、GPIO基本介绍
TMS320F28069有54个GPIO,对应芯片输出的54个引脚,分为A、B两组——A组包括GPIO0~GPIO31,B组包括GPIO32~GPIO58(除了GPIO45~GPIO49),且每个引脚都有自己的复用功能。
4种基本配置:
- 通用I/O口用GPxDIR配置I/O口方向(1为输出,0为输入);
- 复用功能用GPxMUXn配置;
- GPxPUD用于配置I/O口上拉功能(0为使能上拉);
- 量化寄存器GPxQSEL可对输入信号进行量化限制,以消除数字量I/O引脚噪声干扰。
4种读写操作(写0时均无效):
- GPxDAT寄存器独立读/写I/O口信号;
- GPxSET寄存器写1对I/O口进行置位操作;
- GPxCLEAR寄存器写1对I/O进行清零操作;
- GPxTOOGLE寄存器写1对I/O口进行电平翻转操作;
二、GPIO实验(Simulink平台)
1、Simulink基本模型参数配置
首先对模型进行配置,选择模型适应参数后即可生成可读性较强的C语言代码。后续实验模型基本配置都可参考此处!
①求解器类型必须选择固定步长(Fixed step),此模型提供多种算法且没有连续状态。固定步长(基础采样时间)根据实际情况而定,在简单的嵌入式代码生成时没有实际作用,可保持默认auto,单位为秒,也可设置为0.005s,相当于定时器0的中断时间间隔;但是若是针对目标芯片定制的代码生成过程中,会将该步长作为芯片外设或内核中定时器的中断周期。
②将“诊断”下的“数据有效性”中的“多任务数据存储”设置为“无”(none)。
③配置选择相关硬件,配置时钟。外部晶振默认为10MHz,这里将系统时钟配置为最高90MHz,低速时钟外设设置为SYSCLKOUT/4分频。其他外设模块按自己需要设置。
④配置自动代码生成和报告相关的参数。模型Web视图使得生成的代码可以进行模型与代码之间相互的跟踪。
2、GPIO_OUTPUT控制LED灯
控制目标是当计数值大于或等于200时,即大概0.005x200=1s时,GPIO31置1,另外1s置0,实现一个一亮一灭的效果。
搜索counter limited模块,上限设置为400。
搜索compare to constant模块,设置>=200。
根据芯片系列搜索C2806x GPIO_OUTPUT模块,并配置端口为GPIO31,toogle表示电平翻转。
整体实验模型:
点击HARDWARE下的编译,即可生成C代码和代码生成报告:
代码生成报告很全,也可在模型参数配置的代码生成中选择只生成代码!
主函数示例如下:
#include "robot.h"
#include "rtwtypes.h"
#include "MW_target_hardware_resources.h"
volatile int IsrOverrun = 0;
static boolean_T OverrunFlag = 0;
void rt_OneStep(void)
{
/* Check for overrun. Protect OverrunFlag against preemption */
if (OverrunFlag++) {
IsrOverrun = 1;
OverrunFlag--;
return;
}
enableTimer0Interrupt();
robot_step();
/* Get model outputs here */
disableTimer0Interrupt();
OverrunFlag--;
}
volatile boolean_T stopRequested;
volatile boolean_T runModel;
int main(void)
{
float modelBaseRate = 0.005;
float systemClock = 90;
/* Initialize variables */
stopRequested = false;
runModel = false;
c2000_flash_init();
init_board();
#if defined(MW_EXEC_PROFILER_ON) || (defined(MW_EXTMODE_RUNNING) && !defined(XCP_TIMESTAMP_BASED_ON_SIMULATION_TIME))
hardwareTimer1Init();
#endif
;
bootloaderInit();
rtmSetErrorStatus(robot_M, 0);
robot_initialize();
globalInterruptDisable();
configureTimer0(modelBaseRate, systemClock);
runModel = rtmGetErrorStatus(robot_M) == (NULL);
enableTimer0Interrupt();
globalInterruptEnable();
while (runModel) {
stopRequested = !(rtmGetErrorStatus(robot_M) == (NULL));
}
/* Terminate model */
robot_terminate();
globalInterruptDisable();
return 0;
}
/*
* File trailer for generated code.
*
* [EOF]
*/
3、GPIO_INPUT扫描_NORMAL模式
GPIO_INPUT扫描_NORMAL模式是一种常见的GPIO(General-Purpose Input/Output)配置模式,用于微控制器或其他嵌入式系统中的GPIO引脚。在这种模式下,GPIO引脚被配置为输入模式后,微控制器将不断地(周期)扫描这些引脚,检查是否有外部信号的输入。当检测到外部信号时,微控制器可以读取该引脚的电平状态(高电平或低电平),并根据需要进行处理。
这种模式通常用于读取传感器、开关或其他外部硬件设备的状态,以便在微控制器中进行进一步的处理或控制。例如,在智能家居系统中,GPIO_INPUT扫描_NORMAL模式可以用于读取门窗传感器、人体传感器等设备的状态,以实现自动化的家居控制功能。
这里简单举例:用扫描按键的方式控制LED灯。按键输入接口在GPIO42,LED灯接在GPIO25。
首先需要配置GPIO的PUD(上拉禁止寄存器)使能GPIO42电平上拉,这样没按下时该端口保持高电平1,LED灭;按键按下时检测到低电平0,LED灯亮。
4、GPIO_INPUT扫描_EXTERNAL模式
还是按键控制LED灯但这次用的INPUT模式不同!
使用External模式可极大方便对数据的观测!GPIO_INPUT扫描_NORMAL模式和GPIO_INPUT扫描_EXTERNAL模式在功能和使用场景上有所不同。GPIO_INPUT扫描_NORMAL模式主要用于周期性读取输入信号,而GPIO_INPUT扫描_EXTERNAL模式则专为实时检测外部事件设计。根据实际应用的需求选择合适的模式可以提高性能和效率。
Simulink的External模式默认使用的是SCIA,波特率为115200b/s,并且默认复用I/O口是GPIO28、GPIO29,对应开发板上的SCIA接口是RXA、TXA。
所以在进行External模式操作时,通过一根USB转TTL通信线将USB的RX、TX分别接在F28069主控板的TXA、RXA引脚。注意USB和F28069的控制板要共地,同时不能将线序接反,否则Simulink无法通过SCI转USB与DSP进行通信。
首先需要在模型配置时对外部模式进行设置,在“硬件实现”中往下翻找到“External mode”,将Communication interface设置为串口通信Serial。
然后在自己电脑的“设备管理器”中找到串行通信的COM口,输入到Seial port中,这里因为未使用硬件实际插入,显示“未检测到串口No serial port detected”(明白流程即可)。
模型还是一致,其他略。
5、GPIO_INPUT中断控制LED灯
上面都属于将GPIO配置为通用I/O数字量输出,也可以将其配置为外部中断实现控制目的。如将按键配置成外部中断,在中断中执行参数或模式的修改,比常用的按键扫描方式节省资源(“硬件外设资源”替代“软件资源”)。
在simulink中搭建模型,利用“system initiize”模块对中断进行GPIO初始化配置,配置GPIO42为外部中断触发源,并将中断配置为下降沿触发(对应外部中断3)。
搜索“C28x Hardware Interrupt”模块进行硬件中断配置,中断号CPU12,PIE-1对应外部中断XINT3,任务优先级默认,Preemption输入1表示中断可以被抢占,0表示不可以。
利用“subsystem”模块建立Trigger子系统(LED灯控制模型)。在中断函数中分别进行对应的LED翻转,按键(GPIO42)对应LED1灯(GPIO31)、LED2灯(GPIO25)。仿真步长0.05s
最后的模型如下,还是与之前一样点击“HARDWARE”下的“编译”生成代码后将代码拷进开发板,可以发现:按下一次按键,对应的LED灯电平便翻转一次。
往期精彩
STM32专栏(付费9.9)http://t.csdnimg.cn/E2F88
OpenCV-Python专栏(付费9.9)http://t.csdnimg.cn/zK1jV
AI底层逻辑专栏(付费9.9)http://t.csdnimg.cn/zic0f
机器学习专栏(免费)http://t.csdnimg.cn/FaXzAFreeRTOS专栏(免费)http://t.csdnimg.cn/SjIqU电机控制专栏(免费)http://t.csdnimg.cn/FNWM7