STM32 HALライブラリCubeMXチュートリアル(5)シリアル通信インフラストラクチャ

STM32 HALライブラリCubeMXチュートリアル(5)シリアル通信インフラストラクチャ


チュートリアル・ディレクトリのSTM32 HALライブラリCubeMXシリーズ

シリアル通信のプロフィール

UART:万能非同期送受信機(ユニバーサル非同期レシーバ/トランスミッタ)、一般にUARTと呼ばれます。送信すべきデータは、シリアル通信とパラレル通信との間で変換されます。チップのシリアル出力信号にパラレル入力信号として、UARTは、典型的には、他の通信インタフェース結合に統合します。

USARTは、ユニバーサル同期/非同期シリアル受信機/送信機、(ユニバーサル同期/非同期レシーバ/トランスミッタ)USARTは、 全二重ユニバーサル同期/非同期シリアルトランシーバモジュールであり、インタフェースは非常に柔軟なシリアル通信装置です。

3本のピンは、他のデバイスとインターフェースで接続されています。受信データ入力(RX)と送信データ出力(TX):任意USART双方向通信は、少なくとも二つの脚部を必要とします。
RX:シリアル入力データを受信します。データを回復するための技術をオーバーサンプリングすることにより、データとノイズとを区別します。
TX:送信データ出力。送信機が無効になっている場合、出力端子は、I / Oポートの構成に復元されます。送信機が活性化され、データが送信されない場合、TXピンが高いです。そして、インラインスマートカードモードでは、このI / Oポートは、送受信するデータの両方に使用されます。

そこ三つの基本的なUSART送信があり、モード、ポーリング、割り込み、およびDMAを受けます。

USARTのブロック図:
ここに画像を挿入説明
USARTは、特定のプロセスを送受信について「マニュアルSTM32中国のリファレンス」を参照してください、あなたは理解することができ、実用的なアプリケーションをマスターする上での焦点は、CubeMXが大幅にプログラムの作成を簡素化します。便利なアプリケーション。

次に、PC、受信にデータを送信するためにお互いにSTM32の使用の簡単なデモ...

CubeMX設定

串口1默认为PA9,PA10引脚,由于我的单片机开发板PA9,PA10用作了LED驱动,且并未引出,所以将USART1复用到PB6,PB7。
ここに画像を挿入説明
如果使用中断需要使能串口中断:
ここに画像を挿入説明
时钟配置:
ここに画像を挿入説明
ここに画像を挿入説明

初始化程序分析

串口设置的一般步骤可以总结为如下几个步骤:

  1. 串口时钟使能,GPIO 时钟使能
  2. 串口复位
  3. GPIO 端口模式设置
  4. 串口参数初始化
  5. 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)
  6. 使能串口
  7. 编写中断处理函数

使用CubeMX配置,前面6个步骤已经自动帮我们生成了,我们只需要编写中断处理函数和主函数就可以了,我们这里暂时采用轮询的方式并不需要编写中断处理函数。

生成的串口初始化程序主要在usart.c文件中:

  1. 串口参数初始化
void MX_USART1_UART_Init(void)
{ 
  huart1.Instance = USART1; //串口选择
  huart1.Init.BaudRate = 115200; //波特率
  huart1.Init.WordLength = UART_WORDLENGTH_8B; //8位字长
  huart1.Init.StopBits = UART_STOPBITS_1;  //1位停止位
  huart1.Init.Parity = UART_PARITY_NONE;  //无奇偶校验
  huart1.Init.Mode = UART_MODE_TX_RX; //发送接收模式(全双工)
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; //不使用硬件流控制
  huart1.Init.OverSampling = UART_OVERSAMPLING_16; //过采样
}
  1. 串口硬件初始化
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(uartHandle->Instance==USART1)
  {
    __HAL_RCC_USART1_CLK_ENABLE(); //串口时钟使能
    __HAL_RCC_GPIOB_CLK_ENABLE(); //GPIO端口时钟使能
    
    /**USART1 GPIO Configuration    
    PB6     ------> USART1_TX
    PB7     ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //PB6端口初始化
    
    GPIO_InitStruct.Pin = GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //PB7端口初始化
    
    __HAL_AFIO_REMAP_USART1_ENABLE(); //使能复用IO时钟
    
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); //中断优先级管理
    HAL_NVIC_EnableIRQ(USART1_IRQn);
 }	

程序编写

首先在main.c中重定向printf()和scanf()函数到串口发送和接收,方便应用:

/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *f){
 uint8_t temp[1] = {ch};
 HAL_UART_Transmit(&huart1, temp, 1, 0xffff);
return ch;
}

int fgetc(FILE * f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1,&ch, 1, 0xffff);
  return ch;
}
/* USER CODE END 0 */

然后我们就可以在主函数中使用printf发送数据了:打印一个Pikachu

#define user_main_printf(format, ...)  printf( format "\r\n", ##__VA_ARGS__)
/* USER CODE BEGIN 2 */
 user_main_printf("hello world!");
 user_main_printf("       .__ __                  .__           ");
 user_main_printf("______ |__|  | _______    ____ |  |__  __ __ ");
 user_main_printf("\\____ \\|  |  |/ /\\__  \\ _/ ___\\|  |  \\|  |  \\");
 user_main_printf("|  |_> >  |    <  / __ \\  \\___|   Y  \\  |  /");
 user_main_printf("|   __/|__|__|_ \(____  /\\___  >___|  /____/ ");
 user_main_printf("|__|           \\/     \\/     \\/     \\/       ");
  /* USER CODE END 2 */

采用轮询方式接收数据,并且发送到PC串口助手窗口显示:

 while (1)
  {
    ch=getchar();
    HAL_UART_Transmit(&huart1,&ch,1,0);
  }

通过串口助手可以看到打印了hello world和pikachu ,并且在发送窗口发送字符,单片机收到后再发送给PC显示:
ここに画像を挿入説明
仅供参考,错误之处以及不足之处还望多多指教!!

参考文献

  1. 硬石YS-F1Pro开发板开发手册(HAL库版本20170104更新).pdf
  2. ALIENTEK 精英 STM32F103 开发板教程.pdf
  3. STM32F10xxx参考手册.pdf
  4. 【野火】《STM32+HAL+库开发实战指南—基于F103-MINI》.pdf
  5. 我的19岁-电子设计大赛.pdf
发布了13 篇原创文章 · 获赞 14 · 访问量 6168

おすすめ

転載: blog.csdn.net/weixin_43116606/article/details/104222528