接上文 【Start_DSC28034PNT湖人开发板免费体验】开发板使用1和 【Start_DSC28034PNT湖人开发板免费体验】开发板使用2
和 【Start_DSC28034PNT湖人开发板免费体验】开发板使用3
准备用 开发板使用2 中 IIC控制TM1650数码管驱动和扫描按键Sw301- 304
开发板使用3 通过配置SCI模块寄存器,使能串口发送和接收
数码管 左1数码管显示程序abc
左二到左四数码管循环显示程序状态
按下按键Sw301 切换程序abc
串口发送调试信息
在开发板使用2基础上
MAIN.C
/******************************************************************
文 档 名 : HXdemo_DSC28034_IIC_TM1650
开 发 环 境: Haawking IDE V2.1.3
开 发 板:
Start_DSC28034_V1.2
D S P: DSC28034
使 用 库:
作 用:IIC控制TM1650数码管驱动和扫描按键S101 S102 S103
说 明:Flash 工程
----------------------例程使用说明-----------------------------
*
* 通过IIC读写EEPROM,控制TM1650芯片的数字循环显示,
* 清零、扫描按键输入控制显示与调节亮度执行主程序调用
* InitI2C_Gpio(); //IO 初始化为IIC
* I2CA_Init(); // IIC初始化,100KHz
* TM1650_Send()单个数码管显示函数
* TM1650_Read()读取TM1650扫描值,获取按键S101 S102 S103的状态
*
* 现象:左二到左四数码管循环显示0-999,D401闪烁
* 按下按键S101 左1数码管显示数字+1
* 按下按键S102 改变数码管显示亮度
* 按下按键S103 四个数码管清零,D400翻转
*
版 本: V1.0.0
时 间: 2022年8月25日
作 者: heyang
@ mail: support@mail.haawking.com
******************************************************************/
#include "dsc_config.h"
#include <syscalls.h>
#include "IQmathLib.h"
#include "TM1650_IIC.h"
/*函数原型*/
void Scia_Config(uint32 baud);
void Scia_Send(uint8 data);
void Scia_Print(char *str);
void InitLED(void);
void Timer0_init();
INTERRUPT void cpu_timer0_isr(void);
/*全局变量*/
Uint16 Tmp = 0;
char keyReg = 10;
/*主程序入口*/
int main(void)
{
uint8 receiveData[4],i;
/*初始化系统控制*/
InitSysCtrl();
/*初始化内存控制寄存器,使能内存流水线模式*/
InitFlash();
/*初始化串口通信的GPIO口*/
/*GPIO28: SCIRXDA*/
/*GPIO29: SCITXDA*/
InitSciGpio();
/*SCI寄存器配置*/
Scia_Config(9600);
/*通过SCI发送字符串*/
Scia_Print("----------- sci fifo test ------------\r\n");
Scia_Print("Baud Rate: 9600\r\n");
Scia_Print("Data Bits: 8\r\n");
Scia_Print("Parity: none\r\n");
Scia_Print("Stop Bits: 1\r\n");
Scia_Print("\r\n");
Scia_Print("Pls send some message, (level: 4)\r\n");
/*初始化LED*/
InitLED();
/* 清除所有中断和初始化PIE向量表*/
/*禁用CPU中断*/
DINT;
/*初始化PIE控制寄存器到默认状态,默认状态是全部PIE中断被禁用和标志位被清除*/
InitPieCtrl();
/*禁用CPU中断和清除所有CPU中断标志位*/
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断向量表,为PIE向量表中的所有中断向量配置对应向量的入口地址*/
InitPieVectTable();
/*定时器0初始化*/
Timer0_init();
/*初始化IIC总线的Gpio*/
InitI2C_Gpio();
/*IIC初始化*/
I2CA_Init();
/*软件复位IIC从设备*/
//softResetIIC_BUS();
//printf("\r\nTM1650 init...");//标准C的printf输出测试,串口调试助手设置波特率128000bps,ASCII格式显示
/*BIT6到BIT4为亮度调节,BIT0是 1 开启/0关闭*/
LigntVal = 0x11;
/*1级亮度,开启显示*/
TM1650_Send(CMD_SEG, LigntVal);
/*DIG0-DIG3均显示0*/
TM1650_Send(DIG0, SEG7Table[0]);
TM1650_Send(DIG1, SEG7Table[0]);
TM1650_Send(DIG2, SEG7Table[0]);
TM1650_Send(DIG3, SEG7Table[0]);
/*使能全局中断*/
EINT;
while(1)
{
/*判断SCI是否接收到数据*/
if(SciaRegs.SCIFFRX.bit.RXFFST == 4)
{
for(i = 0; i < 4; i++)
{
receiveData[i] = SciaRegs.SCIRXBUF.bit.RXDT;
}
Scia_Print((char*)receiveData);
Scia_Print("\r\n");
}
/*间隔为0.05ms×7200,即360ms*/
if(CpuTimer0.InterruptCount >= 5000)
{
/*定时器0中断次数清零*/
CpuTimer0.InterruptCount = 0;
/*D401翻转*/
GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;
/*Tmp累加,从0-999循环*/
Tmp++;
if(Tmp > 999)
Tmp = 0;
/*DIG1显示Tmp的百位*/
TM1650_Send(DIG1, SEG7Table[Tmp / 100]);
/*DIG2显示Tmp的十位*/
TM1650_Send(DIG2, SEG7Table[(Tmp / 10) % 10]);
/*DIG3显示Tmp的个位*/
TM1650_Send(DIG3, SEG7Table[Tmp % 10]);
/*TM1650获取扫描按键S101 S102 S103,控制数码管数字显示及亮度调节*/
TM1650_Read(CMD_KEY, &keyVal);
/*S101按下时,DIG0显示内容+1*/
if(keyVal == 0x44)
{
keyReg++;
keyReg &= 0x0f;
if(keyReg == 13) //
{keyReg = 10;}
TM1650_Send(DIG0, SEG7Table[keyReg]);
}
/*S102按下时,改变数码管显示亮度*/
if(keyVal == 0x4c) //
{
/*高四位为亮度调节,最后1位是开启、关闭显示*/
LigntVal = (LigntVal + 0x20) & 0x7F;
/*1级亮度,开启显示*/
TM1650_Send(CMD_SEG, LigntVal);
}
/*按下S103时*/
if(keyVal == 0x54)
{
Tmp = 0;
keyReg = 10;
/*DIG0-DIG3清零*/
TM1650_Send(DIG0, SEG7Table[10]);
TM1650_Send(DIG1, SEG7Table[0]);
TM1650_Send(DIG2, SEG7Table[0]);
TM1650_Send(DIG3, SEG7Table[0]);
/*D400翻转*/
GpioDataRegs.GPBTOGGLE.bit.GPIO41 = 1;
}
/*按下Sw304时*/
if(keyVal == 0x5c)
{
Scia_Print("Sw304 down\r\n");
Scia_Print("\r\n");
}
}
}
}
// ----------------------------------------------------------------------------
/******************************************************************
*函数名:void InitLED(void)
*参 数:无
*返回值:无
*作 用:初始化LED
******************************************************************/
void InitLED(void)
{
/*允许访问受保护的寄存器*/
EALLOW;
/*GPIO34配置为通用IO*/
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
/*GPIO34配置为输出*/
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
/*GPIO41配置为通用IO*/
GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 0;
/*GPIO41配置为输出*/
GpioCtrlRegs.GPBDIR.bit.GPIO41 = 1;
/*禁止访问受保护的寄存器*/
EDIS;
}
/******************************************************************
*函数名:void Timer0_init()
*参 数:无
*返回值:无
*作 用:定时器0初始化,0.05ms周期
******************************************************************/
void Timer0_init()
{
/* 初始化CPU定时器*/
InitCpuTimers();
/*
* 配置定时器0,定时器频率为3MHZ,定时器周期为1000us,
* 每隔3M×1000/60M(us),即0.05ms,产生一次中断
*/
ConfigCpuTimer(&CpuTimer0, 3, 1000);
/*使能定时器0中断*/
CpuTimer0Regs.TCR.bit.TIE = 1;
/*打开或重置定时器0*/
CpuTimer0Regs.TCR.bit.TSS = 0;
;
/*定时器0的中断入口地址为中断向量表的INT0*/
EALLOW;
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS;
/*使能CPU的第一组中断*/
IER |= M_INT1;
/*使能PIE级的第一组中断的第七个小中断,即定时器0中断*/
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
}
/******************************************************************
*函数名:INTERRUPT void cpu_timer0_isr(void)
*参 数:无
*返回值:无
*作 用:定时器0中断服务函数
******************************************************************/
INTERRUPT void cpu_timer0_isr(void)
{
/*定时器0中断次数累计*/
CpuTimer0.InterruptCount++;
/*检测IIC模块状态为空闲还是写入*/
char i;
for(i = 0; i < IIC_NODE_NUM; i++)
{
PtrMsg[i]->IIC_TimerOUT = (PtrMsg[i]->MasterStatus == IIC_IDLE) ? 0 : (PtrMsg[i]->IIC_TimerOUT + 1);
}
/*通知可以接收第一组中断的所有中断*/
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
/******************************************************************
*函数名:Scia_Config(uint32 baud)
*参 数: baud,串口波特率
*返回值:无
*作 用: SCIA 初始化配置
******************************************************************/
void Scia_Config(uint32 baud)
{
uint32 div = 0;
uint32 divsel = 0;
uint32 lospcp = 0;
uint32 lspclk = 0;
uint16 brr = 0;
//获取系统时钟的倍频、分频和低速外部时钟的值
div = SysCtrlRegs.PLLCR.bit.DIVF;
divsel = SysCtrlRegs.PLLSTS.bit.DIVSEL;
lospcp = SysCtrlRegs.LOSPCP.bit.LSPCLK;
if (lospcp != 0)
{
lospcp = lospcp * 2;
}
else
{
lospcp = 1;
}
/*分频值设置
divsel为 0时,系统时钟4分频
divsel为 1时,系统时钟4分频
divsel为 2时,系统时钟2分频
divsel为 3时,系统时钟1分频*/
switch (divsel)
{
case 0:
case 1:
lspclk = 16000000 * div / 4 / lospcp;
break;
case 2:
lspclk = 16000000 * div / 2 / lospcp;
break;
case 3:
lspclk = 16000000 * div / 1 / lospcp;
break;
}
brr = lspclk / (baud * 8) - 1;
/*SCI 停止位设置 0:一个停止位 1:两个停止位*/
SciaRegs.SCICCR.bit.STOPBITS = 0;
/*SCI 奇偶校验位 0:奇偶校验 1:偶偶校验*/
SciaRegs.SCICCR.bit.PARITY = 0;
/*SCI 奇偶校验使能 0:关闭 1:启用*/
SciaRegs.SCICCR.bit.PARITYENA = 0;
/*SCI 字符长度 0:1个字长 1:2个字长 ... 7:8个字长*/
SciaRegs.SCICCR.bit.SCICHAR = 7;
/*使能SCI的发送机和接收机*/
SciaRegs.SCICTL1.bit.TXENA = 1;
SciaRegs.SCICTL1.bit.RXENA = 1;
/*SCI 16位波特率选择寄存器 高8位*/
SciaRegs.SCIHBAUD = (uint8) ((brr >> 8) & 0xff);
/*SCI 16位波特率选择寄存器 低8位*/
SciaRegs.SCILBAUD = (uint8) (brr & 0xff);
/*SCI 复位*/
SciaRegs.SCIFFTX.bit.SCIRST = 1;
/*SCI FIFO 使能*/
SciaRegs.SCIFFTX.bit.SCIFFENA = 1;
/*SCI 传输FIFO重置*/
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
/*SCI 传输FIFO清除*/
SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1;
/*接收 FIFO 复位*/
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
/*接收 FIFO 中断清除*/
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
/*接收 FIFO 中断深度设置*/
SciaRegs.SCIFFRX.bit.RXFFIL = 4;
/*FIFO 控制器寄存器设置*/
SciaRegs.SCIFFCT.all = 0;
/*SCI 软件复位,重新启动SCI*/
SciaRegs.SCICTL1.bit.SWRESET = 1;
}
/******************************************************************
*函数名:Scia_Send(uint8 data)
*参 数: data,准备发送的字节
*返回值:无
*作 用: SCIA 发送一个字节
******************************************************************/
void Scia_Send(uint8 data)
{
while (SciaRegs.SCICTL2.bit.TXRDY == 0)
{
}
SciaRegs.SCITXBUF = data;
}
/******************************************************************
*函数名:Scia_Print(char *str)
*参 数: *str,要发送的字符串
*返回值:无
*作 用: SCIA 发送一个字符串
******************************************************************/
void Scia_Print(char *str)
{
while (*str != '\0')
{
while (SciaRegs.SCICTL2.bit.TXRDY == 0)
{
}
SciaRegs.SCITXBUF = *str++;
}
}
// ----------------------------------------------------------------------------
编译Project->Build All
riscv32-haawking-elf-size --format=berkeley "HX_DSC28034_IIC_TM1650.elf"
text data bss dec hex filename
6266 40 1293 7599 1daf HX_DSC28034_IIC_TM1650.elf
13:41:51 Build Finished. 0 errors, 4 warnings. (took 5s.481ms) 下载运行
注意:J302上面的SciRX和SciTX加短接。
J301上面的SDA加短接。
com:
达到目的.
|