2145|1

11

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

五、串口调试 [复制链接]

五、串口调试
本次是以串口发送发送数据和接收数据为例来进行简单调试,具体以打印版本号和打印向串口发送的数据为例:
一、设置外部时钟
1、设置外部晶振:
                                                                          
       我用的是12M的晶振所以设为12MHZ
        2、设置单片机工作频率:
               #ifdefined (STM32F10X_LD_VL)|| (defined STM32F10X_MD_VL)|| (defined STM32F10X_HD_VL)
               /*#define SYSCLK_FREQ_HSE    HSE_VALUE */
              #define SYSCLK_FREQ_24MHz  24000000
              #else
              /*#define SYSCLK_FREQ_HSE    HSE_VALUE */
              /*#define SYSCLK_FREQ_24MHz  24000000 */
              /*#define SYSCLK_FREQ_36MHz  36000000 */
              /*#define SYSCLK_FREQ_48MHz  48000000 */
              /*#define SYSCLK_FREQ_56MHz  56000000 */
             #define SYSCLK_FREQ_72MHz 72000000
             #endif
二、设置串口
         caseSTM_UART1:
                  {
                      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
               
                      /* Configure USART Tx as alternatefunction push-pull */
                      GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
                      GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
                      GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
                      GPIO_Init(GPIOA,&GPIO_InitStructure);
               
                      GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
                     GPIO_InitStructure.GPIO_Mode  =GPIO_Mode_IN_FLOATING;
                      GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
                      GPIO_Init(GPIOA,&GPIO_InitStructure);            
                      break;
                  }
三、初始化串口
          Uart_SetGpio(uartNum);                                         // 管脚设置
          Uart_NVICConfig(uartNum);                                     // 中断配置
   
          initValue.USART_BaudRate   = baud;                            // 设置波特率
          initValue.USART_WordLength= USART_WordLength_8b;                     //数据位
          initValue.USART_StopBits   = USART_StopBits_1;                      // 停止位
          initValue.USART_Parity     = USART_Parity_No;                       // 奇偶位
          initValue.USART_HardwareFlowControl= USART_HardwareFlowControl_None;  // 硬件流控制
          initValue.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;                 //串口模式
        
          USART_Init(STM_Uart[uartNum],&initValue);                       // 初始化串口
          USART_ITConfig(STM_Uart[uartNum],USART_IT_RXNE, ENABLE);        // 接收中断  
          USART_Cmd(STM_Uart[uartNum],ENABLE);                       // EnableUSART
          USART_ClearFlag(STM_Uart[uartNum],USART_FLAG_TC);           // 清标志
四、中断配置
          STM_UART1: NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;
                                    NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0;
六、设置波特率:
          voidAppInit(void)
          {
              SystemInit();                                            // 设置配置
              SystemCoreClockUpdate();                                 // 更新内核时钟
             //NVIC_SetVectorTable(DC_BOOT_SADDR,DC_BOOT_SIZE);  // 中断向量重映射
              SysTickInit(10);                                          // 节拍时钟
              UartInit(STM_UART1,115200);
   
              //IWDTInit();                                            // 独立看门狗
   
              /* 这里添加硬件初始化 */
          }
五、修改中断服务函数
           voidUSART1_IRQHandler(void)
          {
              u8 dat;
      if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)!=RESET)
// 添加次句,防止串口一直进入此中断
                {
                      USART_ReceiveData(USART1);
                 }
   
               if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)         // 串口接收
                {
                       /* Read one byte from the receive dataregister */
                      dat = USART_ReceiveData(USART1);
                      RDTWriteByte(&AppUart1,dat);
      
                 }   
          }
六、读写函数
1、从接受缓冲中读取多字节数据:
void RDTReadNByte(RDT_PAR *pRcv,u8 *pBuf, u16 len)
{
   for (u16 i=0; i
   {
        *(pBuf+i) =pRcv->RwBuf[pRcv->RdCnt];                                   
        if (++(pRcv->RdCnt) >=pRcv->BufLen)
        {
            pRcv->RdCnt = 0;                                              // 清零
        }
   }                                             
}
2、发送多字节数据
void UartSendMultByte(u8 uartNum,u8 *pStr, u16 len)
{      
   while (len--)
   {
        USART_SendData(STM_Uart[uartNum],*pStr++);                         // 发送数据   
        
        while(USART_GetFlagStatus(STM_Uart[uartNum], USART_FLAG_TC) == RESET)  // 获取串口状态
        {
            ;
        }
   }
}
3、获取缓冲区中未读数据长度
u16 RDTGetLen(RDT_PAR *pRcv)
{
   return ((pRcv->WtCnt >= pRcv->RdCnt) ? ((pRcv->WtCnt -pRcv->RdCnt)) :
           ((pRcv->WtCnt + pRcv->BufLen)- pRcv->RdCnt));
}
七、简单打印版本信息:
1、先定义版本信息:
APP_VER AppVerInfo =
{
   "HWV_V1.00\r\n"                               // 硬件版本
   "SWV_V1.00\r\n"                               // 软件版本
   "2013-05-07\r\n"                                // 时间
};
调用版本打印函数:
void App_PrintVersion(void)
{
   UartSendStr(STM_UART1, AppVerInfo.Hardware);
   UartSendStr(STM_UART1, AppVerInfo.Software);
   UartSendStr(STM_UART1, AppVerInfo.CmpTim);
}
这里是将打印应函数放在初始化中的,运行后刚开始在串口工具窗口会看到打印出的数据,只打印一次
八、接收数据后打印
1、先定义一个存放数据的数组:
u8 App_Uart1[ APP_UART_SIZE ] = {0};
RDT_PAR AppUart1 = {0, 0, APP_UART_SIZE, App_Uart1};
2、定时执行下面的函数,用来查询是否接收到数据,如果接收到就从串口输出:
void Task_1(void)
{
u8  temp[100] = { 0 } ;
    u16  uart_len = 0;
    uart_len = RDTGetLen( &AppUart1);            //获取缓存中数据长度
     if(uart_len > 0 )                            //如果有数据
        {
           RDTReadNByte( &AppUart1, temp, uart_len );        //读取多个字节
           UartSendMultByte( STM_UART1, temp, uart_len);     //发送到串口1
        }
}
运行后用串口工具发送任何数据都会被接收并返回发送到串口工具的窗口。
此帖出自stm32/stm8论坛

最新回复

恩,基本如此,缺乏自己的看法和总结。。。。。。  详情 回复 发表于 2014-4-21 14:17
点赞 关注
 

回复
举报

4997

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
恩,基本如此,缺乏自己的看法和总结。。。。。。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表