【Start_DSC28034PNT湖人开发板免费体验】开发板使用4 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

卢松涛 关注 私信
[文章]

【Start_DSC28034PNT湖人开发板免费体验】开发板使用4

接上文 【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:

1692421028111.jpg1692425556789.jpg

达到目的.

更多回帖

×
发帖