前文:
项目中用到的rtt为之前别的项目,由同事裁剪过的rtt,版本:4.0.2,芯片为GD32F407VET6。
1、st中移植rtt时,注意rtt的系统基准时钟,要以systick为基准时钟,st -hal的基准时钟,要用一个非systick的时钟,GD不需要,rtt可以跟GD用同一个systick为基准时钟。
2、调试程序时,一启动调度器,就死机了,后来发现是中断向量表没设置,nvic_vector_table_set();
3、独立看门狗一使能,程序会在版本初始化中死机,原因未知,暂时屏掉独立看门使能。
4、目前程序中用了两个线程,一为主线程,二为空闲线程。但主线程中,调用rt_server_yield()就会触发硬件错误,原因未知。
5、rtt对于硬件错误中断进行重新定义,在context_Iar.s文件中。工程文件中,要添加启动文件startup_gd32f407.s,要不系统时钟就没初始化。函数:rcu_clock_freq_get(),根据不同的参数,可以读出时钟数据。
6、文件gd32f4xx_it.c,中里面有各种外设的中断接口,要添加。
next:
1、空闲线程中,查看各个线程堆栈的使用情况。
2、gd芯片:调试串口012345,控制台线程为uart4,没用DMA,已调通;
用DMA的发送,发不出去数据,跟踪DMA发送数据的原理,
#define ARRAYNUM(arr_nanme) (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme)))
#define USART0_DATA_ADDRESS ((uint32_t)&USART_DATA(USART5))
uint8_t txbuffer[] = "123456";
void Test_Usart(void)
{
static uint8_t i =0u;
rt_device_t new_device;
//uint8_t nTemData[10] = "123456";
//将usart5的配置修改
dma_single_data_parameter_struct dma_init_struct;
if(0 == i)
{
i++;
/* deinitialize DMA1 channel7(USART0 tx) */
//dma_single_data_para_struct_init(&dma_init_struct);dma is no.
//注意dma时钟是否配置
dma_deinit(DMA1, DMA_CH6);//复位DMA一个通道的所有寄存器
dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;//传输方向
dma_init_struct.memory0_addr = (uint32_t)txbuffer;//内存的基地址
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;//内存地址寄存器递增模式使能
dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;//外设传输数据的宽度,字节、半字、字
dma_init_struct.number = ARRAYNUM(txbuffer);//数据传输量
dma_init_struct.periph_addr = USART0_DATA_ADDRESS;//外设的基地址
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;//外设地址寄存器模式不使能
dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;//优先级
dma_single_data_mode_init(DMA1, DMA_CH6, &dma_init_struct);
//注意DMA模式的设置
/* configure DMA mode DMA循环传输模式失能*/
dma_circulation_disable(DMA1, DMA_CH6);
//DMA通道外设使能选择
dma_channel_subperipheral_select(DMA1, DMA_CH6, DMA_SUBPERI5);
/* enable DMA1 channel7 DMA通道使能*/
dma_channel_enable(DMA1, DMA_CH6);
}
new_device = rt_device_find(usart5_Device.cName);
if (new_device != RT_NULL)
{
nvic_irq_enable(DMA1_Channel6_IRQn, 1, 3);
//rt_uint16_t old_flag = new_device->open_flag;
/* enable DMA1 channel7 transfer complete interrupt启用传输 完成中断*/
dma_interrupt_enable(DMA1, DMA_CH6, DMA_CHXCTL_FTFIE);
//new_device->open_flag |= RT_DEVICE_FLAG_STREAM;
//new_device->ops->write(new_device, 0, txbuffer, ARRAYNUM(txbuffer));
//new_device->open_flag = old_flag;
}
//GD130的配置-DMA发送
void dma_send_usart()
{
DMA_Enable(DMA1_CHANNEL2,DISABLE);
DMA_SetCurrDataCounter(DMA1_CHANNEL2,USART1_TX_LEN);//设置发送的数据长度
DMA_Enable(DMA1_CHANNEL2,ENABLE);
while(!DMA_GetBitState(DMA1_INT_TC2)){}
DMA_Enable(DMA1_CHANNEL2,DISABLE);
DMA_ClearBitState(DMA1_INT_TC2);
}
下面是一个GD-usart-DMA发送的论坛;
http://bbs.eeworld.com.cn/thread-880640-1-1.html#lastpost