串口、以及引脚重映射实例

  1 /*Include---------------------------*/
  2 #include"stm32f10x_lib.h"        //包含所有的头文件
  3 #include<stdio.h>
  4 
  5 //----------------函数声明--------------------
  6 void Delay_MS(u16 dly);
  7 void RCC_Configuration(void);
  8 void GPIO_Configuration(void);
  9 void USART3_Configuration(void);
 10 
 11 
 12 u8 tab[] = "hello welcome to class !";
 13 
 14 /*******************************************************************************
 15 * Function Name  : main
 16 * Description    : Main program.
 17 * Input          : None
 18 * Output         : None
 19 * Return         : None
 20 *******************************************************************************/ 
 21 int main(void)
 22 {
 23     u8 i ,id_num[12];;
 24     #ifdef DEBUG
 25     debug();
 26     #endif
 27     //------------初始化------------
 28     RCC_Configuration();
 29     GPIO_Configuration();    
 30     USART3_Configuration();
 31 
 32      id_num[0] = *((u8*)(0x1FFFF7E9));    //stm32芯片id的放置地址,96位id;12字节
 33      printf("hello world
");
 34     //------------向usart3发送数据-----------
 35     for(i=0;i<12;i++)
 36     {
 37         USART_SendData(USART3, tab[i]);
 38         id_num[i] = *((u8*)(0x1FFFF7E9+i));
 39         USART_SendData(USART3, id_num[i]);    //将id发送给串口
 40         Delay_MS(2000);
 41     //    while(USART_ GetFlagStatus(USART_FLAG_TC)==RESET)
 42     //        ;
 43     }
 44         
 45 }
 46 
 47 /*******************************************************************************
 48 * Function Name  : Delay_Ms
 49 * Description    : delay 1 ms.
 50 * Input          : dly (ms)
 51 * Output         : None
 52 * Return         : None
 53 *******************************************************************************/
 54 void Delay_MS(u16 dly)
 55 {
 56     u16 i,j;
 57     for(i=0;i<dly;i++)
 58         for(j=1000;j>0;j--);
 59 }
 60 
 61 /*******************************************************************************
 62 * Function Name  : RCC_Configuration
 63 * Description    : Configures the different system clocks.
 64 * Input          : None
 65 * Output         : None
 66 * Return         : None
 67 *******************************************************************************/
 68 void RCC_Configuration(void)
 69 {
 70     //----------使用外部RC晶振-----------
 71     RCC_DeInit();            //初始化为缺省值
 72     RCC_HSEConfig(RCC_HSE_ON);    //使能外部的高速时钟 
 73     while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);    //等待外部高速时钟使能就绪
 74     
 75     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    //Enable Prefetch Buffer
 76     FLASH_SetLatency(FLASH_Latency_2);        //Flash 2 wait state
 77     
 78     RCC_HCLKConfig(RCC_SYSCLK_Div1);        //HCLK = SYSCLK
 79     RCC_PCLK2Config(RCC_HCLK_Div1);            //PCLK2 =  HCLK
 80     RCC_PCLK1Config(RCC_HCLK_Div2);            //PCLK1 = HCLK/2
 81     RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);    //PLLCLK = 8MHZ * 9 =72MHZ
 82     RCC_PLLCmd(ENABLE);            //Enable PLLCLK
 83 
 84     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);    //Wait till PLLCLK is ready
 85     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    //Select PLL as system clock
 86     while(RCC_GetSYSCLKSource()!=0x08);        //Wait till PLL is used as system clock source
 87     
 88     //---------打开相应外设时钟--------------------
 89     RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);    //使能APB2外设的GPIOC的时钟
 90     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE); //复用功能时钟开启             
 91 }
 92 
 93 /*******************************************************************************
 94 * Function Name  : GPIO_Configuration
 95 * Description    : 初始化GPIO外设
 96 * Input          : None
 97 * Output         : None
 98 * Return         : None
 99 *******************************************************************************/
100 //由电路图可知;配置PC10,PC11引脚
101 void GPIO_Configuration(void)
102 {
103     //CLK:PB5  CLR:PE11 DATA:PE10
104     GPIO_InitTypeDef    GPIO_InitStructure;        //声明一个结构体变量
105     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;     //选择PB.1-
106     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //管脚频率为50MHZ
107     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //输出模式为 "复用推挽输出"
108     GPIO_Init(GPIOC,&GPIO_InitStructure);                 //初始化GPIOB寄存器
109     
110     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 |GPIO_Pin_11 ;     //选择PE.10 PE.11
111     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //管脚频率为50MHZ
112     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;     //输出模式为    "浮空输入"
113     GPIO_Init(GPIOC,&GPIO_InitStructure);                 //初始化GPIOE寄存器
114     
115     //开启时钟    必须在RCC_Configuration中设置    
116     
117     
118     //端口重映射:PC10/PC11
119     GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);    
120 } 
121 
122 void USART3_Configuration(void)
123 {
124     USART_InitTypeDef USART_InitStructure;
125     USART_InitStructure.USART_BaudRate = 9600;
126     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
127     USART_InitStructure.USART_StopBits = USART_StopBits_1;
128     USART_InitStructure.USART_Parity = USART_Parity_No;
129     USART_InitStructure.USART_HardwareFlowControl =    USART_HardwareFlowControl_None;
130     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
131 
132     USART_Init(USART3, &USART_InitStructure);
133 
134     USART_Cmd(USART3, ENABLE);    //开启使能
135 }
136 
137 /***********************************************************
138  name:    fputc                                               *
139  Description:重定向这个c库printf函数,文件流--->串口USART  *
140                                                            *
141 ************************************************************/
142 int fputc(int ch,FILE *f)
143 {
144     //ch发送给USART1
145     USART_SendData(USART3, ch);
146     //等待发送完毕
147     while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET)
148         ;
149     return ch;
150 }
原文地址:https://www.cnblogs.com/chris-cp/p/3916608.html