HC32f072使用过程中问题记录

1、使用sysclk做1ms定时中断时,不能使用ddl.c中定义的延时函数(比如delay1ms),因为延时函数会把sysclk的参数重新配置。像ADC初始化时就用到了ddl.c里的delay10us(2),需要改成其他延时方式。

2、显示屏刷新很慢,原因是显示屏的引脚控制都是用的函数,调用函数Gpio_SetIO->setBit->修改寄存器。

#define LCD_SCL_SET   Gpio_SetIO(GpioPortB,LCD_SCL)  

后改成直接修改寄存器,屏幕的刷新速度快了很多。

#define LCD_SCL_SET   (M0P_GPIO->PBOUT |= 1 << LCD_SCL)

但是使用PBOUT寄存器控制输出时出现问题,不能修改某个位的值,如果想修改某一位,用PBBSET、 PBBCLR寄存器。

//液晶控制口置1操作语句宏定义

#define LCD_SCL_SET()   M0P_GPIO->PBBSET |= 1 << LCD_SCL

#define LCD_SDA_SET()   M0P_GPIO->PBBSET |= 1 << LCD_SDA     

#define LCD_RS_SET()   M0P_GPIO->PBBSET |= 1 << LCD_RS

#define LCD_RST_SET()   M0P_GPIO->PBBSET |= 1 << LCD_RST

//液晶控制口置0操作语句宏定义

#define LCD_SCL_CLR()   M0P_GPIO->PBBCLR |= 1 << LCD_SCL   

#define LCD_SDA_CLR()   M0P_GPIO->PBBCLR |= 1 << LCD_SDA    

#define LCD_RST_CLR()   M0P_GPIO->PBBCLR |= 1 << LCD_RST

#define LCD_RS_CLR() M0P_GPIO->PBBCLR |= 1 << LCD_RS

3、问题:如果定时器不是在整个周期关的,需要清除计数?目前看是,可以在开发板上试试。

答:不会清零,除非你使能更新事件,否则只能手动清零,关闭定时器,只是关闭了提供给定时器的时钟信号,其它的都没有变

4、调dx8时看iic波形ack没有拉低,只是低了一点没形成低电平,修改SDA引脚为开漏输出 就可以了。

5、Flash_Init(6, FALSE))里的第一个参数跟HCLK有关,HCLK为48mhz,改成6.

6、串口使用时中断方式和查询方式混用导致卡死在读取串口状态函数。

即中断接收,

发送用的查询Uart_SendDataPoll()

 

 

当通信数据少不经常用时不容易发现问题,像蓝牙网关模块一直在收发数据运行一段时间就会卡在Uart_GetStatus函数里。

正确的使用查询方式是像官方例程里发送和接收都是查询方式:

 

中断方式:发送和接收都在中断中处理。

注意发送要用缓冲区,先把要发送的数据放缓冲区,等进发送中断时发出去。

/* 开关全局中断的宏 */
#define ENABLE_INT()	__set_PRIMASK(0)	/* 使能全局中断 */
#define DISABLE_INT()	__set_PRIMASK(1)	/* 禁止全局中断 */

void USART0_senddata(uint8_t *buf,uint16_t len)
{
    uint16_t t=0;
	volatile uint16_t usCount;
	
    for(t=0;t<len;t++)
    {
		/*如果缓冲区已满,则等待缓冲区空*/
		while(1)
		{					
			DISABLE_INT();
			usCount = g_UART_0.usTxCount;
			ENABLE_INT();

			if (usCount < UART0_TX_BUF_SIZE)
			{
				break;
			}
		}
        /*将要发送的数据放入缓冲区*/   
		g_UART_0.TxBuf[g_UART_0.usTxWrite] = buf[t];
		if(++g_UART_0.usTxWrite >= UART0_TX_BUF_SIZE)
		{
			g_UART_0.usTxWrite =0;
		}
		DISABLE_INT();
		g_UART_0.usTxCount ++;
		ENABLE_INT();
    }
	Uart_EnableIrq(M0P_UART0,UartTxIrq);
	//发送第一个数据,以唤起发送中断
	Uart_SendDataIt(M0P_UART0,g_UART_0.TxBuf[g_UART_0.usTxRead]); 
	//缓冲区移一个数据
	if(++g_UART_0.usTxRead >= UART0_TX_BUF_SIZE)
	{
		g_UART_0.usTxRead =0;
	}
	DISABLE_INT();
	g_UART_0.usTxCount--;
	ENABLE_INT();
}

7、注意定时器能计时的最长时间

定时器0123最多256分频,定时器456最多1024分频

定时器模式0的计时周期是从ARR到0xffff,然后再从ARR开始,所以周期是0xffff-ARR+1 = 0X10000-ARR

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值