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