[文档下载] 新唐M051学习之(2)-串口

[复制链接]
 楼主| 追逐浪花 发表于 2015-12-12 17:25 | 显示全部楼层 |阅读模式
今天参照CMSIS库里面的例子写了个简单的串口程序。
        在写串口程序之前先把硬件连接好。准备一个USB转TTL的模块(我用的是STC的下载器),他可以把M051发送的数据传送到计算机上,通过串口助手程序接收数据。USB转TTL模块的TXD接P3.0,RXD接P3.1,GND接M051的GND(也就是共地)。安装12M晶振和30pf电容。如下图所示。

MDK中也要做如下设置。从M051SeriesBSP_CMSIS_v2.01.002 里找到cor_cm0.c 、 system_M051Series.c 、 retarget.c 三个文件,加入到项目中,如下图示。


includle paths 里面也要多包含两个路径:
 楼主| 追逐浪花 发表于 2015-12-12 17:27 | 显示全部楼层
C:\Keil\M051SeriesBSP_CMSIS_v2.01.002\M051SeriesBSP_CMSIS_v2.01.002\LibM051Series\CMSIS\CM0\CoreSupport
C:\Keil\M051SeriesBSP_CMSIS_v2.01.002\M051SeriesBSP_CMSIS_v2.01.002\LibM051Series\StdDriver\inc

源文件如下:
  1. #include <stdio.h>
  2. #include <M051Series.h>
  3. #define PLLCON_SETTING      SYSCLK_PLLCON_50MHz_XTAL
  4. #define PLL_CLOCK           50000000
  5. void SystemInit(void)
  6. {}
  7. void SYS_Init(void)
  8. {
  9. /*---------------------------------------------------------------------------------------------------------*/
  10. /* Init System Clock                                                                                       */
  11. /*---------------------------------------------------------------------------------------------------------*/
  12.     /* Unlock protected registers */
  13.     SYS_UnlockReg();

  14.     /* Enable External XTAL (4~24 MHz) */
  15.     SYSCLK->PWRCON |= SYSCLK_PWRCON_XTL12M_EN_Msk;

  16.     /* Waiting for 12MHz clock ready */
  17.     SYS_WaitingForClockReady( SYSCLK_CLKSTATUS_XTL12M_STB_Msk);

  18.     /* Switch HCLK clock source to XTAL */
  19.     SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_XTAL;

  20.     /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
  21.     SYSCLK->PLLCON|= SYSCLK_PLLCON_PD_Msk;

  22.     /* Set PLL frequency */        
  23.     SYSCLK->PLLCON = PLLCON_SETTING;

  24.     /* Waiting for clock ready */
  25.     SYS_WaitingForClockReady(SYSCLK_CLKSTATUS_PLL_STB_Msk);

  26.     /* Switch HCLK clock source to PLL */
  27.     SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_PLL;

  28.     /* Enable IP clock */        
  29.     SYSCLK->APBCLK = SYSCLK_APBCLK_UART0_EN_Msk | SYSCLK_APBCLK_UART1_EN_Msk;

  30.     /* Select IP clock source */
  31.     SYSCLK->CLKSEL1 = SYSCLK_CLKSEL1_UART_XTAL;;

  32.     /* Reset PWMB channel0~channel3 */                    
  33.     SYS->IPRSTC2 = SYS_IPRSTC2_PWM47_RST_Msk;                    
  34.     SYS->IPRSTC2 = 0;      


  35.     /* Update System Core Clock */
  36.     /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  37.     //SystemCoreClockUpdate();
  38.     PllClock        = PLL_CLOCK;            // PLL
  39.     SystemCoreClock = PLL_CLOCK / 1;        // HCLK
  40.     CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

  41. /*---------------------------------------------------------------------------------------------------------*/
  42. /* Init I/O Multi-function                                                                                 */
  43. /*---------------------------------------------------------------------------------------------------------*/
  44.     /* Set P3 multi-function pins for UART0 RXD and TXD  */
  45.     SYS->P3_MFP = SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;

  46.     /* Lock protected registers */
  47.     SYS_LockReg();
  48. }
 楼主| 追逐浪花 发表于 2015-12-12 17:28 | 显示全部楼层
  1. void UART0_Init()
  2. {
  3. /*---------------------------------------------------------------------------------------------------------*/
  4. /* Init UART                                                                                               */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6.     UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_DIV_MODE2(__XTAL,115200);

  7.     _UART_SET_DATA_FORMAT(UART0, UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1);
  8. }


  9. int main(void)
  10. {
  11.     uint32_t u32Item;
  12.     SYS_Init();
  13.     UART0_Init();
  14.     printf("请发送一个字符\n");
  15.     while(1)
  16.     {
  17.         u32Item = getchar();
  18.         printf("你发送的是:%c\n",u32Item);
  19.     }
  20. }
 楼主| 追逐浪花 发表于 2015-12-12 17:31 | 显示全部楼层
烧写程序,并连接串口助手(我用的是STC的烧写工具里的串口助手),助手的波特率必须设置115200,因为M051的程序里设置的是115200。随便发送几个字母测试。




Micachl 发表于 2015-12-12 21:12 | 显示全部楼层
有没有关于USB 的复合设备的例子啊
稳稳の幸福 发表于 2016-4-14 22:36 | 显示全部楼层
助手的波特率必须设置115200,因为M051的程序里设置的是115200
643757107 发表于 2016-4-14 23:06 | 显示全部楼层
retarget.c 这个文件是干啥用的,没有看到啊
zhuotuzi 发表于 2016-4-17 21:47 | 显示全部楼层
一般编程器都是使用115200波特率通信,而在做项目的时候通常采用9600通信。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

256

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部