20170731~20170802

这几天调试串口助手,把自己曾经犯过的错总结一遍:

20170731:

今天主要熟悉串口的基本知识,基本概念,波特率等的概念;

20170801:

  1. Company芯片,串口发送和接收函数中,一定要定义发送和接收的字长,如UART_Send(UART2,(u8*)sendbuff,10) 和UART_Receiver(UART2,(u8*)rx_buff,10)的第三个参数就是发送和接收的长度,写时一定要定义出来,在调用发送和接收函数时第三个参数应该是数字,而不是send_len之类的,自己写这个函数时犯了一个这样的错,以后谨记;
  2. Company芯片的系统时钟,内部系统时钟不准确,如果用外部时钟要对时钟进行初始化,对应的函数是SystemInit( )和SystemClockSet(CLOCK_7816IN,CLOCK_DIV(0))。在SystemClockSet(CLOCK_7816IN,CLOCK_DIV(0))函数中,第一个参数是配置外部时钟的类型,这个可以从底下的库函数中直接查出来,第二个参数是分频系数,函数CLOCK_DIV(0)的参数0就是分频系数,系统默认的分频系数是在这个系数基础上加1,所以CLOCK_DIV(0)的分频系数是0+1=1;
  3. 用外部时钟的话,要接到另外一个板子上的时钟,串口实验中,接到GPIO4(7816CLKIN)引脚,板子上本身带有的外部13.56M的时钟烧录程序时只能烧录一次,这是芯片本身带有的Bug;
  4. 调试串口前,首先要配置时钟,程序如下:
    pclk_freq = 13560000; //300-57600 £º 13958334 ; 115200-128000 : 15145761
    baud_value_by_128 = (8u * pclk_freq) / baud_rate;
    baud_value_by_64 = baud_value_by_128 / 2u;
    baud_value = baud_value_by_64 / 64u;
    fractional_baud_value = baud_value_by_64 - (baud_value * 64u);
    fractional_baud_value += (baud_value_by_128 - (baud_value * 128u)) - (fractional_baud_value * 2u);
    if(baud_value <= (uint32_t)UINT16_MAX)
    {
    if(baud_value > 1u)
    {
    /*
    * Use Frational baud rate divisors
    */
    /* set divisor latch */
    UARTx->LCR |= DLAB;

                /* msb of baud value */
                UARTx->DMR = (uint8_t)(baud_value >> 8);
                /* lsb of baud value */
                UARTx->DLR = (uint8_t)baud_value;
    
                /* reset divisor latch */
                UARTx->LCR &= ~DLAB;
    
                /* Enable Fractional baud rate */
                UARTx->MM0 |= EFBR;
    
                /* Load the fractional baud rate register */
                UARTx->DFR = (uint8_t)fractional_baud_value;
        }
        else
        {
                /*
                 * Do NOT use Frational baud rate divisors.
                 */
                /* set divisor latch */
                UARTx->LCR |= DLAB;
    
                /* msb of baud value */
                UARTx->DMR = (uint8_t)(baud_value >> 8u);
                /* lsb of baud value */
                UARTx->DLR = (uint8_t)baud_value;
    
                /* reset divisor latch */
                UARTx->LCR &= ~DLAB;
    
                /* Disable Fractional baud rate */
                UARTx->MM0 &= ~EFBR;
    
        }
    

    }
    其中pclk_freq是主时钟,剩下的算法按照步骤算就行,最终算出DMR和DLR的数值,然后还可以带入公式T=(DMR*0x100 + DLR)*Tclk*8*2,T为UART时钟周期,Tclk 为系统主时钟周期。也就是说,T是串口波特率的倒数,例:如果设置波特率为57600,则T的大小应该是1/57600;Tclk是系统主时钟的倒数,如设置系统主时钟为13560000时,Tclk应该是1/13560000

20170802:

1、串口程序:Keil软件仿真时,要把硬件连接上再仿真;STM32不需要硬件连接就能仿真。这是因为,在STM32的Target选项,有一项System-Viewer File(.Sfr)下面配置的是$$Device:STM32F103RC$SVD\STM32F103xx.svd,但是Company芯片的相应的选项是空的,也就是什么都没写。写和不写的区别是:STM32在仿真时,硬件方面的都已经给配置好了,不需要连接硬件就可以直接仿真,但是Company芯片仿真时,硬件方面没有配置好,所以硬件方面需要连接J-link和电源,然后仿真,观察自己写的程序哪里不对。下图1和图2分别是STM32的配置项和Company的配置项的图片,以后仿真时切忌不要再犯同样的错误;
20170731~20170802_第1张图片
图1 STM32配置项
20170731~20170802_第2张图片
图2 Company配置项
2、仿真:硬件连接好后,也就是连接好Jlink和电源后,把程序下载进去,点击 仿真按钮,开始仿真,仿真过程,可以设置断点,然后点击run,就可以将程序直接运行到断点处,方便查找。
还可以单步运行,然后在Watch Windows下面输入要查看的变量,查看它们的值是否变化,方便查找程序的失误;
3. 最后一点也很重要,一直以为USB to TTL的驱动装上了,原来没装上,下图是安装成功后,在电脑—管理里面查看的结果,其中标红部分是安装的USB to TTL驱动装好后对应的COM口,刚开始自己查看串口对应的COM口时,查看的是通信端口COM1,其实正确的应该是USB-SERIAL CH340(COM8),以后学习过程中,这样的离谱错误不要再犯!
以上是自己这几天调试串口时所犯的错,以后注意。

你可能感兴趣的:(学习总结)