[范例教程] 【M0】 MG32F02A 学习笔记⑤ UART0 串口发送

[复制链接]
1518|3
 楼主| noctor 发表于 2018-9-21 15:28 | 显示全部楼层 |阅读模式
本帖最后由 noctor 于 2018-9-25 14:10 编辑
        上回我们说到了MG32F02A的TIM26进行PWM波形输出。帖子详情:https://bbs.21ic.com/icview-2556460-1-1.html
         作为调试的一个极好用的方式,随时使用串口输出能够输出一些有用的信息用于帮助你调试,所以这次就来学习一下串口的使用吧。
         程序如下:

  1. #include "MG32x02z_DRV.H"
  2. #include <stdio.h>

  3. #define URTX URT0

  4. typedef uint8_t u8;
  5. typedef uint16_t u16;
  6. typedef uint32_t u32;
  7. typedef uint64_t u64;

  8. void CSC_Init (void)
  9. {
  10.         CSC_PLL_TyprDef CSC_PLL_CFG;
  11.    
  12.         
  13.     UnProtectModuleReg(MEMprotect);             // Setting flash wait state
  14.     MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
  15.     ProtectModuleReg(MEMprotect);

  16.     UnProtectModuleReg(CSCprotect);
  17.         CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
  18.         CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1

  19.         
  20.         /* CK_HS selection */
  21.         CSC_IHRCO_Select(IHRCO_12MHz);                        // IHRCO Sel 12MHz
  22.         CSC_IHRCO_Cmd(ENABLE);
  23.         while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
  24.         CSC_ClearFlag(CSC_IHRCOF);
  25.         CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO


  26.         /* PLL */
  27.         /**********************************************************/
  28.         CSC_PLL_CFG.InputDivider=PLLI_DIV_2;        // 12M/2=6M
  29.         CSC_PLL_CFG.Multiplication=PLLIx16;                // 6M*16=96M
  30.         CSC_PLL_CFG.OutputDivider=PLLO_DIV_2;        // PLLO=96M/2=48M
  31.         CSC_PLL_Config(&CSC_PLL_CFG);
  32.         CSC_PLL_Cmd(ENABLE);
  33.         while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
  34.         CSC_ClearFlag(CSC_PLLF);
  35.         /**********************************************************/

  36.         
  37.         /* CK_MAIN */
  38.         CSC_CK_MAIN_Select(MAIN_CK_HS);        


  39.         /* Configure ICKO function */
  40.                
  41.         /* Configure peripheral clock */
  42.         CSC_PeriphProcessClockSource_Config(CSC_UART0_CKS, CK_APB);
  43.          CSC_PeriphOnModeClock_Config(CSC_ON_UART0,ENABLE);
  44.          CSC_PeriphOnModeClock_Config(CSC_ON_PortB,ENABLE);
  45.         
  46.     ProtectModuleReg(CSCprotect);
  47.    
  48. }


  49. int fputc(int ch,FILE *f)
  50. {
  51.         
  52.         URT_SetTXData(URTX,1,ch);
  53.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  54.         URT_ClearITFlag(URTX,URT_IT_TC);
  55.         
  56.         return ch;
  57. }

  58. void UartSendByte(int ch)
  59. {
  60.         
  61.         URT_SetTXData(URTX,1,ch);
  62.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
  63.         URT_ClearITFlag(URTX,URT_IT_TC);
  64.         
  65. }


  66. void URT0_Init(void)
  67. {
  68.     URT_BRG_TypeDef  URT_BRG;
  69.     URT_Data_TypeDef DataDef;
  70.         PIN_InitTypeDef PINX_InitStruct;
  71.    
  72.         //==Set GPIO init
  73.         //PB8 PPO TX ,PB9 ODO RX
  74.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;                  // Pin select Push Pull mode
  75.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;          // Enable pull up resistor
  76.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                        
  77.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;                 // Pin output driver full strength.
  78.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;        // Pin input deglitch filter clock divider bypass
  79.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;                 // Pin input data not inverse
  80.         PINX_InitStruct.PINX_Alternate_Function  = PB8_AF_URT0_TX;                                // Pin AFS = URT0_TX
  81.         GPIO_PinMode_Config(PINB(8),&PINX_InitStruct);                                                          // TXD at PB8

  82.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_OpenDrain_O;                 // Pin select Open Drain mode
  83.         PINX_InitStruct.PINX_Alternate_Function  = PB9_AF_URT0_RX;                                // Pin AFS = URT0_RX
  84.         GPIO_PinMode_Config(PINB(9),&PINX_InitStruct);                                                          // RXD at PB9

  85.    
  86.     //=====Set Clock=====//
  87.     //---Set BaudRate---//
  88.     URT_BRG.URT_InteranlClockSource = URT_BDClock_PROC;
  89.     URT_BRG.URT_BaudRateMode = URT_BDMode_Separated;
  90.     URT_BRG.URT_PrescalerCounterReload = 0;                                //Set PSR
  91.     URT_BRG.URT_BaudRateCounterReload = 3;                                //Set RLR
  92.     URT_BaudRateGenerator_Config(URTX, &URT_BRG);                            //BR115200 = f(CK_URTx)/(PSR+1)/(RLR+1)/(OS_NUM+1)
  93.     URT_BaudRateGenerator_Cmd(URTX, ENABLE);                            //Enable BaudRateGenerator
  94.     //---TX/RX Clock---//
  95.     URT_TXClockSource_Select(URTX, URT_TXClock_Internal);                //URT_TX use BaudRateGenerator
  96.     URT_RXClockSource_Select(URTX, URT_RXClock_Internal);                //URT_RX use BaudRateGenerator
  97.     URT_TXOverSamplingSampleNumber_Select(URTX, 25);                //Set TX OS_NUM
  98.     URT_RXOverSamplingSampleNumber_Select(URTX, 25);                //Set RX OS_NUM
  99.     URT_RXOverSamplingMode_Select(URTX, URT_RXSMP_3TIME);
  100.     URT_TX_Cmd(URTX, ENABLE);                                            //Enable TX
  101.     URT_RX_Cmd(URTX, ENABLE);                                            //Enable RX
  102.    
  103.    

  104.     //=====Set Mode=====//
  105.     //---Set Data character config---//
  106.     DataDef.URT_TX_DataLength  = URT_DataLength_8;
  107.     DataDef.URT_RX_DataLength  = URT_DataLength_8;
  108.     DataDef.URT_TX_DataOrder   = URT_DataTyped_LSB;
  109.     DataDef.URT_RX_DataOrder   = URT_DataTyped_LSB;
  110.     DataDef.URT_TX_Parity      = URT_Parity_No;
  111.     DataDef.URT_RX_Parity      = URT_Parity_No;
  112.     DataDef.URT_TX_StopBits    = URT_StopBits_1_0;
  113.     DataDef.URT_RX_StopBits    = URT_StopBits_1_0;
  114.     DataDef.URT_TX_DataInverse = DISABLE;
  115.     DataDef.URT_RX_DataInverse = DISABLE;
  116.     URT_DataCharacter_Config(URTX, &DataDef);
  117.     //---Set Mode Select---//
  118.     URT_Mode_Select(URTX, URT_URT_mode);
  119.     //---Set DataLine Select---//
  120.     URT_DataLine_Select(URTX, URT_DataLine_2);
  121.    
  122.    
  123.     //=====Set Data Control=====//
  124.     URT_RXShadowBufferThreshold_Select(URTX, URT_RXTH_1BYTE);
  125.     URT_IdlehandleMode_Select(URTX, URT_IDLEMode_No);
  126.     URT_TXGaudTime_Select(URTX, 0);
  127.    
  128.     //=====Enable URT Interrupt=====//
  129.     //URT_IT_Cmd(URTX, URT_IT_RX, ENABLE);
  130.     //URT_ITEA_Cmd(URTX, ENABLE);
  131.     //NVIC_EnableIRQ(URT0_IRQn);

  132.     //=====Enable URT=====//
  133.     URT_Cmd(URTX, ENABLE);
  134.                
  135.         //==See MG32x02z_URT0_IRQ.c when interrupt in
  136. }




  137. int main()
  138. {

  139.         CSC_Init();
  140.         URT0_Init();

  141.         printf("Hello!\n");

  142. }



这个程序里做了printf重定向,这样要输出信息直接用printf就好了。
ruoyuzhiji 发表于 2018-9-23 17:03 | 显示全部楼层
MG32F02A 哪里可以拿到样品?
ruoyuzhiji 发表于 2018-9-23 17:04 | 显示全部楼层
我在某宝上没看到有卖。
 楼主| noctor 发表于 2018-9-25 14:06 | 显示全部楼层
ruoyuzhiji 发表于 2018-9-23 17:04
我在某宝上没看到有卖。

你看看私信?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

82

帖子

3

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