rtt_调试

前文:
项目中用到的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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值