- 2024-08-23
-
发表了主题帖:
基于RISCV指令集的中科昊芯DSP(280025C)开发板测试(二)——低功耗模式功耗简测
本帖最后由 zhaoxiawanqiu 于 2024-8-23 21:50 编辑
昊芯入门学习记录-LPM简易测试
任务目标:
主函数执行两LED状态翻转20次后进入三种低功耗模式,每次间隔小于1S,系统160Mhz,默认外设配置(所有外设时钟均打开)。
一、测试数据
1、IDEL模式下功耗(电流显示其功耗,5V直流电源供电)
以上两图分别为未进入IDEL模式和进入IDEL模式(LED停止翻转)时电流消耗,显然可以观察到其电流均在168mA,即进入IDEL模式对该任务情况下负载功耗没有改变,分析其原因为在时钟初始化时打开了所有外设,进入IDEL模式时这些外设没有被关闭,又因该任务(灯是否翻转)对功耗没有影响,故有该现象。
2、StandBy模式下功耗
以上两图分别为未进入StandBy模式和进入该模式(LED停止翻转)时电流消耗,显然可以观察前者电流为166mA、后者电流为55mA,显然进入该模式可以明显降低系统功耗。
3、Halt模式下功耗
以上两图分别为未进入Halt模式和进入该模式(LED停止翻转)时电流消耗,显然可以观察到前者电流在167mA、后者电流在51mA,显然进入该模式可以明显降低系统功耗,且较Standby模式功耗更低。
4、测试视频(halt模式,其余两种模式类同)
[localvideo]45cde5ffdc4f781c94490027215cf836[/localvideo]
二、代码解读
1、初始化延时,该函数大约在160Mhz频率的情况下延时2-3S,可防止系统上电进入低功耗模式而无法重新装载程序。
for(uint8_t j=0;j<100;j++)
SysCtl_delay(50000000);
2、主函数LED翻转25次后进入低功耗模式,给一个计数变量每循环一次自加,当Cnt变量是25的整数倍时进入低功耗模式(通过不同的进入函数进入三种低功耗模式),Cnt变量也为退出低功耗模式做准备,以便于下一次执行25次翻转后再进入低功耗模式,LED翻转延时时间约为0.5S。
while(1)
{
Cnt++;
if(!(Cnt%25))
{
GPIO_setPinConfig(GPIO_26_GPIO26);
GPIO_setPadConfig(26, GPIO_PIN_TYPE_INVERT);
GPIO_setQualificationMode(26, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(26, GPIO_DIR_MODE_IN);
SysCtl_setStandbyQualificationPeriod(30);
SysCtl_enableLPMWakeupPin(26);
SysCtl_enterHaltMode();
Device_init();
}
GPIO_togglePin(31);
GPIO_togglePin(34);
for(uint8_t j=0;j<20;j++)
SysCtl_delay(50000000);
}
三、总结和待完成部分
本次实验在频率固定外设固定的情况下测试了3种低功耗模式的电流消耗,IDEL模式若不关闭外设则无法起到降低功耗的作用,Standby模式和Halt模式有较大程度的功耗降低。 由于对参考手册的解读尚有欠缺之处,所以在进入低功耗模式后退出的唤醒部分程序还未能弄懂,待后面进一步读懂手册的基础上再进行该部分程序的编写设计。
- 2024-07-27
-
发表了主题帖:
基于RISCV指令集的中科昊芯DSP(280025C)开发板测试(一)——GPIO中断
本帖最后由 zhaoxiawanqiu 于 2024-7-27 14:08 编辑
昊芯入门学习记录-GPIO中断
任务目标:
使用外中断触发一GPIO控制开发板上两LED状态翻转
一、如下图所示,知道GPIO31、34经过一缓冲器分别接到LED6、LED7的阴极,故在本实验中IO端口低电平有效。
二、根据Haawking IDE的引导创建一个新的工程,选择280025C的型号,程序烧写至Flash中。
略
三、要实现任务目标主函数所使用资源分析
1、时钟和外设配置函数: Device_Init(); 创建工程自动生成(160Mhz,本实验不考虑到功耗算力等条件,故不需要调整)
系统默认时钟来自内部OSC1,10MHZ,经PLL模块倍频16倍为160Mhz。默认LSPCLK分频号为2,分频系数为4,为40Mhz。
下面是该函数,在Device.c里面,主函数里面会自己调用,不用管。
2、中断模组初始化和向量表初始化函数; interrupt.h 里面调用, Interrupt_initModule(); Interrupt_initVectorTable();上述两个函数在驱动库里面interrupt.c文件里面编写,实现中断的初始化功能,需要在主函数中调用它们。
3、GPIO初始化,配置GPIO9为输入模式(为外中断触发引脚),GPIO31、34为输出模式,gpio.c里面调用相关配置函数
GPIO_setPinConfig(uint32_t pinConfig);
该函数在配置IO口的时候使用,传入宏定义的IO地址,如GPIO_9_GPIO9为GPIO9的地址的宏,无返回值。
GPIO_setPadConfig(uint32_t pin, uint32_t pinType)
该函数为配置IO口的类型,参数一为端口号(直接给数字即可),参数二为端口类型,传入宏定义好的类型名即可,如GPIO_PIN_TYPE_PULLUP为推挽模式,无返回值。
GPIO_setQualificationMode(uint32_t pin, GPIO_QualificationMode qualification);
该函数为配置IO口的时钟,参数一为端口号(直接给数字即可),参数二为时钟配置,传入宏定义好的时钟设置即可,如GPIO_QUAL_SYNC为同步SYSCLK时钟,无返回值。
GPIO_setDirectionMode(uint32_t pin, GPIO_Direction pinIO);
该函数为配置IO口的输入输出方向,参数一为端口号(直接给数字即可),参数二为方向配置,传入宏定义好的参数即可,如GPIO_DIR_MODE_IN为输入模式,无返回值。
在main.c里面写一个GPIO初始化函数,调用上述四个配置函数,然后在主函数里面调用该初始化函数,并且给31、34引脚分别写1、0。如下图示:
4、GPIO9中断配置,调用gpio.h相关函数,在gpio.h里面可以看到相关函数详细信息,这里用图片给出。
在主函数调用这三个函数,并给合适参数即可实现gpio9的中断配置
GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_RISING_EDGE);//给中断入口号,配置成上升沿触发
GPIO_setInterruptPin(9, GPIO_INT_XINT1);//设置端口9为中断引脚,给入口号
GPIO_enableInterrupt(GPIO_INT_XINT1);//使能该中断IO入口号
5、中断使能寄存器、使能端口地址、全局使能,调用interrupt.h里面相关函数
再主函数中调用这三个函数,实现中断配置
Interrupt_register(INT_XINT1,&GPIO9_INT_Handler);//给定中断入口号对应地址宏定义参数,给定中断服务函数地址。
Interrupt_enable(INT_XINT1);//使能对应中断入口
Interrupt_enableGlobal();//使能全局中断
5.1、编写中断服务函数如下,在里面翻转两引脚电平,然后清除中断组号即可,该函数在main.c前面需要声明。
__interrupt void GPIO9_INT_Handler(void)
{
GPIO_togglePin(31);
GPIO_togglePin(34);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
三、整体实现代码,该任务仅在main.c里面编写相关函数,代码如下;
#include <syscalls.h>
#include "IQmathLib.h"
#include "hx_intrinsics.h"
#include "driverlib.h"
#include "device.h"
#include "hx_fintdiv.h"
void User_GPIO_Init(void);
__interrupt void GPIO9_INT_Handler(void);
int main(void)
{
//
// Intialize device clock and peripherals
//
Device_init();
//init gpio pin
User_GPIO_Init();
GPIO_writePin(31, 1);
GPIO_writePin(34, 0);
Interrupt_initModule();
Interrupt_initVectorTable();
GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_RISING_EDGE);
GPIO_setInterruptPin(9, GPIO_INT_XINT1);
GPIO_enableInterrupt(GPIO_INT_XINT1);
Interrupt_register(INT_XINT1,&GPIO9_INT_Handler);
Interrupt_enable(INT_XINT1);
Interrupt_enableGlobal();
while(1);
return 0;
}
__interrupt void GPIO9_INT_Handler(void)
{
GPIO_togglePin(31);
GPIO_togglePin(34);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
void User_GPIO_Init(void)
{
//设置GPIO9为输入模式,为中断做准备
GPIO_setPinConfig(GPIO_9_GPIO9);
GPIO_setPadConfig(9, GPIO_PIN_TYPE_INVERT);
GPIO_setQualificationMode(9, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(9, GPIO_DIR_MODE_IN);
//设置GPIO34,GPIO31为输出模式,控制LED
GPIO_setPinConfig(GPIO_31_GPIO31);
GPIO_setPadConfig(31, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(31, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(31, GPIO_DIR_MODE_OUT);
GPIO_setPinConfig(GPIO_34_GPIO34);
GPIO_setPadConfig(34, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(34, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(34, GPIO_DIR_MODE_OUT);
}
//
// End of File
四、实验结果与分析
上电下载程序,按下复位按键后LED6、LED7分别为灭、亮状态如下图:
然后间断不停GPIO9高电平,切换两灯状态[localvideo]6ae6fc273cab17038830353f3824b4ab[/localvideo]
五、实验总结
本次实验测试了GPIO中断的功能,使用到了GPIO、中断相关的配置函数,了解了系统时钟配置,通过翻转LED状态完成功能验证。中间也遇到了一个测试问题,就是IO9接插上一杜邦线后就不停的触发中断,此时杜邦线另一端处于悬空的状态,大概是噪声或是我使用的杜邦线材质等原因干扰造成中断一直被触发,我后面测试的时候就用了一个万用表表笔不停触碰GPIO9也起到了相同效果。正常的解决思路:加电容、加上下拉电阻在外中断触发引脚,只要不让该引脚处于浮空状态即可。
- 2024-07-03
-
回复了主题帖:
测评入围名单: 中科昊芯HXS320F28025C,基于RISC-V的DSP
个人信息无误,确认可以完成测评分享计划