close

ST_logo_20130425.png

在上一篇[STM32F103C8T6-MCU學習筆記]STM32F103C8T6專案建立完成後,來建立必要的基本功能與測試,

1. 實驗材料

STM32F103C8T6開發板*1

20181027_181027_0001.jpg

USB TO TTL*1

20181015_181015_0003.jpg

J-link*1

20181027_181027_0002.jpg

USB延長線*1

20181015_181015_0001.jpg

線材*1

402985.jpg

2. 電路接線

此開發板上已有LED,如下所示,

1.JPG

USB TO TTL的接線依照STM32F103C8T6 Data Sheet,選擇USART3進行相對應的接線,

2.JPG

3. 程式撰寫

以下程式都存在 STM32F103_Configuratio裡

delay_config.c

#include "delay_config.h"

/*
程式名稱:延遲us
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2017/2/7
程式修改日期:N/A
程式說明:
以us(微秒)為單位來設定延遲時間
*/
void delay_us(uint16_t n){
    uint32_t dly;

    while(n!=0){
        dly=delay_mcnt/1000;    while(dly!=0) dly--;
        n--;
    }
}

/*
程式名稱:延遲ms
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2017/2/7
程式修改日期:N/A
程式說明:
以ms(毫秒)為單位來設定延遲時間
*/
void delay_ms(uint16_t n){
    uint32_t  dly;

    while(n!=0){
        dly=delay_mcnt;    while(dly!=0) dly--;
        n--;
    }
}

delay_config.h

#ifndef __DELAY_CONFIG_H
#define __DELAY_CONFIG_H

#include "main.h"

/*延時係數*/
#define delay_mcnt 9000

/* 延遲us */
void delay_us(uint16_t n);
/* 延遲ms */
void delay_ms(uint16_t  n);

#endif 

gpio_config.c設置LED

#include "gpio_config.h"

/*
程式名稱:LED配置初始化
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/7
程式修改日期:N/A
程式說明:

*/
void LED_ConfigInit(void){         
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);    

  GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}

gpio_config.h設置LED

#ifndef __GPIO_CONFIG_H
#define __GPIO_CONFIG_H

#include "main.h"

/* LED初始化 */
void LED_ConfigInit(void);

#endif 

uart3_config.c

#include "uart3_config.h"

/* 結構變數UART_3 */
_UART_Type UART_3;
/* 結構指標*UART3_Ptr */
_UART_Type *UART3_Ptr=&UART_3;

/*
程式名稱:UART3配置初始化
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/10/27
程式修改日期:N/A
程式說明:

*/
void UART3_ConfigInit(void){
    
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
    
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
    
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
    
  USART_InitStructure.USART_BaudRate = 115200;
  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(USART3, &USART_InitStructure);
    
  USART_Cmd(USART3, ENABLE);    
  USART_ClearFlag(USART3, USART_FLAG_TC);
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/*
程式名稱:UART3傳送
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/6
程式修改日期:N/A
程式說明:

*/
void UART3_Send(uint8_t* stringData, uint16_t length){
    uint16_t i=0;
    
    for(i=0; i<length; i++){
    /* Send Transaction data */
    USART_SendData(USART3, *(stringData+i));
        while(USART_GetFlagStatus(USART3, USART_FLAG_TC)!=SET);
    }
}

/*
程式名稱:UART3中斷接收
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/6
程式修改日期:N/A
程式說明:

*/
void USART3_IRQHandler(void){
  /* USART in Receiver mode */
  if (USART_GetITStatus(USART3, USART_IT_RXNE)!=RESET){
     /* Receive Transaction data */
        UART3_Ptr->rxData[UART3_Ptr->rxCount++] = USART_ReceiveData(USART3);
        
        if(UART3_Ptr->rxData[UART3_Ptr->rxCount-2]=='\r' && UART3_Ptr->rxData[UART3_Ptr->rxCount-1]=='\n'){
            UART3_Send(UART3_Ptr->rxData, UART3_Ptr->rxCount);
            UART3_Ptr->rxCount = 0;
        }                
  }
}

uart3_config.h

#ifndef __UART3_CONFIG_H
#define __UART3_CONFIG_H

#include "main.h"

#define rxDataLength 255

/*
程式名稱:UART1全域變數
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2017/11/9
程式修改日期:N/A
程式說明:

*/
typedef struct
{
    uint8_t  rxFlag;
    uint8_t  rxData[rxDataLength];
    uint16_t rxCount; 
}_UART_Type;
/* 結構變數UART_3 */
extern _UART_Type UART_3;
/* 結構指標*UART3_Ptr */
extern _UART_Type *UART3_Ptr;

/* UART3配置初始化 */
void UART3_ConfigInit(void);
/* UART3傳送 */
void UART3_Send(uint8_t* stringData, uint16_t length);

#endif

完成後如下所示,

4.JPG

在User中的bsp.c, main.c, main.h需增加以下程式,

bsp.c

#include "bsp.h"

/*
程式名稱:開發板全域變數初始化
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/3/6
程式修改日期:N/A
程式說明:

*/
void BSP_VariableInit(void){

}

/*
程式名稱:開發板整體系統初始化
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/3/6
程式修改日期:N/A
程式說明:

*/
void BSP_Init(void){
    /* LED配置初始化 */
    LED_ConfigInit();
    /* UART3配置初始化 */
    UART3_ConfigInit();
}

main.c

#include "main.h"

/*
程式名稱:主程式
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/6
程式修改日期:N/A
程式說明:

*/
int main(void){

    /* 開發板全域變數初始化 */
    BSP_VariableInit();
    /* 開發板整體系統初始化 */
    BSP_Init();
     
  /* Infinite loop */
  for(;;){
        if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)==0){
            GPIO_SetBits(GPIOC, GPIO_Pin_13);
        }else{
            GPIO_ResetBits(GPIOC, GPIO_Pin_13);
        }
        delay_ms(500);
  }
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)

  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

main.h

#ifndef __MAIN_H
#define __MAIN_H

#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <math.h> 
#include <stdlib.h>

/* STM32F429_Configuration */
#include "delay_config.h"
#include "gpio_config.h"
#include "uart3_config.h"

/* User */
#include "main.h"
#include "bsp.h"
#include "global_variable.h"

#endif

4.  實驗結果

LED測試,每500ms閃爍一次,

20181027_181027_0004.jpg

20181027_181027_0003.jpg

UART測試,利用終端機測試,

3.JPG

在終端機輸入UART Test,同時也會回應UART Test

5.JPG

arrow
arrow
    文章標籤
    ARM ST MCU GPIO UART
    全站熱搜

    鄭智遠 發表在 痞客邦 留言(0) 人氣()