マルチバイトのシリアル伝送USART1をstm32f103c8

UARTブートローダと非常に奇妙な現象に遭遇したいくつかのコードを書きました。

簡単な紹介は、最初の統一の構成IOポートMCUで、その後、シリアルポートのパラメータを設定して、周期的に送信される「0」と「\ rを」:コードは次のとおりです。進は0x30から0x0Dのです

メインINT(ボイド)
{ 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
  RCC_HSE_Configuration(); //初期化する外部の高速クロック
  SysTick_Init(); 
  IO_Init(); //ポートボード初期化
  Uart_Init(115200)を; //シリアルポートを初期化し

  つつ(1)/ *無限*ループ/ 
  { 
    UART_SendByte( '0'); 
    UART_SendByte( '\のR&LT'); 
    遅延(1000); 
  } 
} 

ボイドIO_Init(ボイド)
{ 
  GPIO_InitTypeDef GPIO_InitStructure; 
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA、ENABLE); 
//構成USART1テキサス州(PA。 09)機能ピンとプルモードとして GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP。 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz。 USART_InitStructure.USART_Parity = USART_Parity_No。 ()GPIOA、&GPIO_InitStructure とGPIO_Init。 GPIO_ResetBits(GPIO、GPIO_Pin_9)。 //配置USART1送信(PA.10)功能引脚并作为是浮き空输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10。 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING。 GPIO_Init(GPIO、&GPIO_InitStructure)。 } (ボーのuint32_t)ボイドUart_Init { USART_InitTypeDef USART_InitStructure。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1、ENABLE)。 USART_InitStructure.USART_BaudRate =ボー。 USART_InitStructure.USART_WordLength = USART_WordLength_8b。 USART_InitStructure.USART_StopBits = USART_StopBits_1。 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None。 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1、&USART_InitStructure)。 // USART_ClearFlag(USART1、USART_FLAG_TC)。 USART_Cmd(USART1、ENABLE)。 }

結果は、プログラム、操作がテストする時間がかかり、非常に奇妙な感じ、0x3fを0x30から0x0Dの前に正常であり後に送られた最初のバイトをダウンロードしています。

、シリアルポート設定機能で次の2つのシリアルポート設定:1を試してみてください

(ボーのuint32_t)Uart_Initボイド
{ 
  ; USART_InitTypeDef USART_InitStructure 
  GPIO_InitTypeDef GPIO_InitStructure; 
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1、ENABLE); 
  
  //構成USART1送信(PA.09)関数ピンプルモードとして
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  (GPIOAと、&​​GPIO_InitStructure)GPIO_Init; 

  //構成USART1送信(PA.10)機能端子とフローティング入力モードとして
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
  GPIOAとGPIO_Init(、 GPIO_InitStructure&); 

  USART_InitStructure.USART_BaudRate =ボー。
  USART_InitStructure.USART_WordLength = USART_WordLength_8b。
  USART_InitStructure.USART_StopBits = USART_StopBits_1。
  USART_InitStructure.USART_Parity = USART_Parity_No。
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None。
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 

  USART_Init(USART1、&USART_InitStructure)。
// USART_ClearFlag(USART1、USART_FLAG_TC)。
  USART_Cmd(USART1、ENABLE)。
}

これは、彼らは0x30から0x0Dのを受け、電力正常です

2試してみてください:この変更を、シリアルクロックは、内周ポート設定機能で開かれます。

IO_Initの空隙(ボイド)
{ 
  GPIO_InitTypeDef GPIO_InitStructure; 

  |; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA RCC_APB2Periph_GPIOB、ENABLE)
  (RCC_APB2Periph_USART1 ENABLE)RCC_APB2PeriphClockCmd; //ポートを開くクロックが進んでいる場合、周辺

  //構成USART1送信(PA.09)機能端子およびAS出力モードを引く
  ; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 
  ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP 
  ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz 
  ;(GPIOA、&GPIO_InitStructure有する)GPIO_Init 
  ;(GPIOA、GPIO_Pin_9有する)GPIO_ResetBits 

  機能の端子として//構成USART1送信(PA.10)、及びフローティング入力モード
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
  (GPIOAと、&​​GPIO_InitStructure)GPIO_Init。
} 

また、通常の出力0x30から0x0Dを

 

概要:STM32のペリフェラルクロックは追加ポートの設定の前に開くように設定する必要があります

おすすめ

転載: www.cnblogs.com/IdeaMing/p/11462692.html