中科之旅------GD32 /stm32/mpc5604过程中遇到的问题

1.GD32 gpio配置问题,pc7作为timer7_ch1

在GD32F303xx_Datasheet_Rev1.2里看到

而在GD32F30x_User_Manual_CN_V1.1里则找不到一点pc7的资料,所以认为,由于这个gpio没有remap的功能,所以GD32F30x_User_Manual_CN_V1.1里就不特别说了,而如果要复用哪个功能就得先使能那个功能模块。

2.一开始不知道GD32的中断函数定义在哪,原来在

C:\Users\Administrator\Desktop\ZKSS\GD32系列开发\GD32303C_START_GD32F30x_Firmware_Library_Routine_ANC\GD32303C_START_GD32F30x_Firmware_Library_Routine\Project\2_Systick_LED\MDK-ARM\list\GD32303C_START.map中。

3.GD32 DAC如何确定输出电压?

如果选择8位的DAC,那么最大值就是2的8次,对应3.3v,如果是选择12位的DAC,那么最大值就是2的12次,最大电压同样是3.3v

4.DAC 和DMA绑定,我用DMA ch1去绑定DAC1,发现不行直到看了这个图

改用ch3搞定

4.用DAC+DMA功能的时候,DMA那边配置为DMA_PERIPHERAL_WIDTH_32BIT的时候,出现了奇怪的现象,DAC只能8bit有效,哪怕地址是R12的地址,只有用DMA_PERIPHERAL_WIDTH_16BIT的时候才是12位地址有效

6.EEPROM一直读不出正确值,看了spec发现

This pin must be connected to either VSS or VCC. If tied
to VSS, write operations are enabled. If tied to VCC,
write operations are inhibited but read operations are
not affected
 

5.用ADC自带的测温度功能,发现ADC0可以,ADC1不行,查了手册

然后问了技术支持确认只有ADC0可以

6.之前参考example里的running_led去操作gpio发现不对,看了数据手册发现

原来这里才是拉高拉低的正确方式

7.gd32 f303的can的波特率计算有问题

虽然数据手册上是

然而最后算下来,其实真正波特率是这个的1/2,。。。。。,而且误差必须控制在千分之5,比如500k的要求要千分之4左右

7.

gd405工程编译遇到错误就把这些文件拷到这个目录即可

9.

添加#include <stdio.h>

10.

遇到这个问题,就重装keil到c盘然后把patch也放在keil目录下安装,安装目录也选择c盘的keil已经安装好的目录即可

11.gd32f405设置gpio为output高电平,用他的库函数

gpio_mode_set(RCU_GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_8);
    gpio_output_options_set(RCU_GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8);

    GPIO_BC(RCU_GPIOC) = GPIO_PIN_8;
    GPIO_BOP(RCU_GPIOC) = GPIO_PIN_8;居然连output都设置不了简直垃圾,提醒大家千万注意gd的库错误巨多

后来改用

    GPIO_CTL(GPIOC) = 0x10000;
    GPIO_PUD(GPIOC) = 0x20000;
    GPIO_OCTL(GPIOC) = 0x100;直接写才行了

12.配置PLLN的时候务必注意下图

我之前设置了24结果无效,难怪串口的设置的波特率系数和计算的差一倍。然而后续太狗血了,哪怕plln有效,波特率依然要除以2

13.在ADC使用DMA功能的时候要注意

void adc_dma_mode_enable(uint32_t adc_periph)
{
    ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_DMA);
    ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_DDM); 一定要使能这个,因为原来的库函数里不使能,而且数据手册很坑爹
}

该死不死写什么单次模式,其实扫描模式也要使能

14,关于管脚复用

15.gd的startup.s中可能会漏中断

少了64号中断

导致我的DMA中断一直卡在default handler中。。。。。因为本来72的中断向量变成了71.。。。

16.之前303的DMA中断正常,但是405不行,后来发现

405还要设置这个PERIENN。而303不用

17.中断里用计数循环的话变量要定义成全局变量,这样会保持之前的值

18.keil配置gd405的时候

要选中这个ic才行,不能只选STM32F405这个大类

19.读gpio状态,虽然默认设置是输入,但是时钟一定要开起来

 rcu_periph_clock_enable(RCU_GPIOA);

20.i2s开发遇到的问题

首先是时钟,可以选sysclk分频,也可以选外接到I2S_CKIN引脚,然后需要在rcu那边设置一下

还有个问题就是DMA和i2s直通,由于我配置的不是i2s1_add而是spi1,所以DMA这边通道要选

通道4的功能0而不是功能2

还有spi那边要把

发送缓冲区DMA使能


21.如果要把jtdi复用成spi cs,先改复用寄存器,然后改成output模式即可

22.如果想要把一个char类型的数组转换成浮点数

typedef union 
{
int m;
float f;
}fnum;

    d.m = 0x3e800000;
    

d.f就是浮点数但是直接给d.f 0x3e800000赋值则不行。

23.如果想要获取DMA2stream2的完成中断

void DMA2_Stream2_IRQHandler(void)  
{
  if(DMA_GetITStatus(DMA2_Stream2, DMA_IT_TCIF2)) //一定要注意DMA_IT_TCIF2这个要和stream对应上
      {
     for(i = 0; i < 4; i++)
                    {
                    tmp = ad_buff_a[i]*gain[i];
                    ad_buff_a[i] = tmp;
                    }

               //printf("%d\n",ad_buff_a[0]);
               set_dac1_out(ad_buff_a[0]);;
               set_dac2_out(ad_buff_a[1]);
               set_compare(1,ad_buff_a[2]);
               set_compare(2,ad_buff_a[3]);
               set_adc_finish = 1;
        
         DMA_ClearITPendingBit(DMA2_Stream2, DMA_IT_TCIF2);
      }
}

24.DAC如果输出幅值和预期相比较小的话,是因为outputbuffer没有使能的缘故

25.ADC的RCC reset要注意

 

注意这个是所有ADC共用的,所以只要reset一次,千万要注意不要重复reset

26.如果要从上位机往下传数据,由于串口的数据类型是char,但是下位机需要float类型,那么用这个办法也不错

假设我将uart的数据存在data指向的数组中,那么我的freq_data是一个包含float类型数据的结构体

struct freq_struct
{
    float  H_threshold;
    float  L_threshold;
   struct   para_conf_t freq_single[6];
};那么直接copy进去即可,当然要注意数据的大小端问题

memcpy((unsigned char*)(&freq_data) + num_para,data,len);

27.今天用DMA+DAC发送一个float类型的数组,结果发现始终出现方波,照理我的数据全部大于零,应该是一条曲线才对,后来看了一下dma才发现

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; 
    DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word; 

一开始我的size选的是半word,但是我的float类型的数组单个长度是一个word,而float中的数据其实只有半个字的长度也就是前半个字是0,后半个字有效,这样一来就出现了方波,这个问题也算自己想到了。

但是后续发现如果直接给DMA float类型的数组的话,会出现传输错误    TEIFx:数据流 x 传输错误中断标志
 数据流 x 上发生传输错误,但是int就可以,可能我的float类型溢出了,因为DAC那边显示的错误是

DAC 1 通道发生 DMA 下溢错误状况(当前所选触发源以高于 DMA 服务能力的频率驱动
DAC 1 通道转换)
但是其实不是频率而是数据格式问题。多大的数据用多大的size就对了

28.在搞mpc5604的gpio的时候发现一个问题

很多人很喜欢写这样的程序

void init_pin(void)
{
    SIU.PCR[18].R = 0x0600;  
    SIU.PCR[19].R = 0x0100;    

}这是uart的管脚配置

由于5604是大端模式,所以RX19管脚很好理解,因为

Alternate functions are chosen by setting the values of the PCR.PA bitfields inside the SIUL module.
PCR.PA = 00  AF0; PCR.PA = 01  AF1; PCR.PA = 10  AF2; PCR.PA = 11  AF3. This is intended to select
the output functions; to use one of the input functions, the PCR.IBE bit must be written to ‘1’, regardless of the
values selected in the PCR.PA bitfields. For this reason, the value corresponding to an input only function is
reported as “—”.
设成input的时候无所谓管脚复用,但是18管脚作为TX就有点奇怪了,为啥要射OBE为1呢,要知道

For output pads:
— Select the appropriate alternate function in Pad Config Register (PCR)
— OBE is not required for functions other than GPIO
所以其实OBE也是无所谓的

29.今天用一个stm32 的demo工程的时候,发现有句赋值语句 a = b始终无法被打断点,后来才知道由于

这个Optimization是代表编译优化等级,正常是0,但是那个demo是3,而我这个a没有在别的地方用到,所以导致被优化而无法打断点。

30.keil安装的时候遇到了

Keil μVision Setup --Cannot create destination file. 'D:\Keil5\ARM\ARMCLANG\bin\ucrtbase.dll' System Error Code:  "拒绝访问" 

原来是360的关系,退出360即可

31.如果遇到调试的时候断点打不上去,先检查变量是否有重复定义

32.stm32下载一定要选

猜你喜欢

转载自blog.csdn.net/u013308744/article/details/80664261