本帖最后由 我没有 于 2019-4-6 11:27 编辑

*******由于我的板子收到的计较晚,又赶上公司这段时间忙,没有来得及及时跟大家分享
*******首先要感谢张老师做的这次活动,给了我们这些刚刚入门的实习生学习的机会,废话不多说,先来看看这个小巧的板子,太精致了哈,分享两张照片。
2.jpg 1.jpg
*******上面的板子是通上电的效果,板子上面是有一个三色的灯。拍的可能不清楚。
*******在没有拿到板子之前,我就阅读了给的材料,我就开始尝试着下载程序。刚刚要走出第一步就卡到了,我用我以前积累的软件程序下载不进去,到最后也没有找到原因,我尝试了一下“stm32 isp程序下载器”,这才下进去。
******在使用下载软件的时候,一定要下载CH340驱动的,不然是找不到串口的,我的电脑再插上之后是没有提示的,也可以下载驱动精灵之类的驱动软件,自动安装的。

******板子上还有很多的功能,一起来学习,一起来探索吧,欢迎大家来互动
******我把我用的下载软件和驱动百度云分享给大家
链接:https://pan.baidu.com/s/1FKts-b20TF-ijdHuDeNeNQ
提取码:m7me



*****************************************************************************************************************************************************************
由于我是初学者,编写程序在我看的的资料中是有两种编程的方式:一种是库函数版本的,一种是寄存器版本的。本人比较喜欢库函数版本版本,下面我来解析一下两种函数的编程方式,根据自己的喜好进行编写:
库函数版本:
首先我们要定义引脚,32f103的引脚有8中模式
       1、浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
       2、带上拉输入GPIO_IPU——IO内部上拉电阻输入
       3、带下拉输入GPIO_IPD—— IO内部下拉电阻输入
       4、模拟输入GPIO_AIN ——应用ADC模拟输入,或者低功耗下省电
       5、开漏输出GPIO_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
       6、推挽输出GPIO_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
       7、复用功能的推挽输出GPIO_AF_PP ——片内外设功能(I2C的SCL,SDA)
       8、复用功能的开漏输出GPIO_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
void LED_GPIO_Config(void)
{               
               /*定义一个GPIO_InitTypeDef 类型的数据结构体*/
                GPIO_InitTypeDef        GPIO_InitStructure;
                /*外设时钟*/
                RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
                /*GPIO控制的引脚*/                                                
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                  
                /*引脚的模式为推完输出*/
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;   
                /*引脚速率50MHz */   
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                /*调用库函数 ,初始化GPIOA*/
                GPIO_Init(GPIOA, &GPIO_InitStructure);                                       
                /* 关闭引脚的灯*/
                GPIO_SetBits(GPIOA, GPIO_Pin_0);
             //解释一下,GPIO_SetBits是置1,GPIO_ResetBits是置0,通常我们在设计电路都是喜欢低电触发LED灯的
}
//之后我们就可以在主函数中为所欲为了,引脚可以随便定义,但是这个板子的三原色的灯的引脚PA0\1\2(B\R\G)
int main(void)
{        
        /* LED的初始化,放到这里 */
        LED_GPIO_Config();        
        while (1)
        {
                 GPIO_SetBits(GPIOA , GPIO_Pin_0);
              //GPIO_ResetBits(GPIOA, GPIO_Pin_0);
        }
}
寄存器版本
int main(void)
{        
        /* LED 端口初始化,直接寄存器同样需要串口的初始化 */
        LED_GPIO_Config();         
        /* 直接控制寄存器 */
        while(1)
        {
                // ODR GPIOA
                // 15 14 13 12     11 10 9 8    7 6 5 4    3 2 1 0
                // 0  0  0  0      0  0  0 0    0 0 0 0    0 0 0 0 (复位值)
                // 1  1  1  1      1  1  1 1    1 1 1 1    1 1 1 0
                GPIOA->ODR = 0XFFFE;                 //低电平,GPIOA0(LED0)灯亮
                }
//直接对每一位进行置0或者置1的操作
}
每一个引脚都有着特殊的应用方式,要特别注意!!!!


****************************************************************************************************************************
在我所从事的工作,用过到了两方面的作用1.计算处理的能力2.通讯的能力
下面我来解析一下,串口通讯的配置过程,及其使用方式
1,定义中断结构体,和串口结构体
2,使能时钟
3,编写中断函数
4,使能中断
首先32单片机不像52单片机那样简单,32单片机的引脚有很多功能,需要配置uart的引脚。Stm32f103有五组串口分别是
uart1:PA9\PA10(TX\RX)
uart2 : PA2\PA3
uart3:PB10\PB11
uart4 : PC10\PC11
uart5:PC12\PD2
如需其他要求可以根据自己的需求更换或者再另外定义串口
void USART1_Config()
{
      GPIO_InitTypeDef     GPIO_InitStructure;         //引脚结构
      USART_InitTypeDef       USART_InitStructure;    //串口结构

      /* 使能USART1的时钟 */  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA , ENABLE);

      /*配置USART1 TX,并设置为复用推挽输出模式*/
      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);

      /*配置USART1 RX,并设置为浮空输入模式*/
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
      GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);

      /*配置USART1模式*/
      USART_InitStructure.USART_BaudRate = 115200;     //波特率设置为115200,可根据自己需求更改//
      USART_InitStructure.USART_WordLength= USART_WordLength_8b;               //配置串口传输的字长8位//
      USART_InitStructure.USART_StopBits = USART_StopBits_1; //配置停止位为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;                             //配置串口为双线全双工通信,将RX、Tx模式都开启//
      USART_Init(USART1,&USART_InitStructure);                                                                                           //向寄存器写入配置参数//
      USART_Cmd(USART1, ENABLE);                                                                                                                                   //使能USART1外设//
}
//中断定义
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef      NVIC_InitStructure;   
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

        /* 使能串口中断*/
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);//把结构体丢到配置函数,及写入对应寄存器中
}
void    main()
{     
USART1_Config();   
USART_SendData(USART1, (uint8_t) ch);//数据发送函数
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待发送完毕

USART_ReceiveData(USART1);       //数据接收函数
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收完毕
}

/****************************************************************************************************************************************************
下面是我作的简单的对该板子的简单设计
1.利用触摸电容让三色LED灯闪亮,
2.并且通过串口发送出数据 或者 字符
上面三张已经对LED和串口的简单的介绍,触摸按键和LED灯的控制的过程是一样的
        void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
}
        //KEY0 PC5 KEY1 PC4 KEY2 PB3 KEY3 PB4
void Touch_Key_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);      
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);      
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOC,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOB ,GPIO_Pin_3|GPIO_Pin_4);
        GPIO_ResetBits(GPIOC ,GPIO_Pin_4|GPIO_Pin_5);       
}
void USART1_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
       
        /* config USART1 clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
       
        /* USART1 GPIO config */
        /* Configure USART1 Tx (PA.09) as alternate function 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);   
        /* Configure USART1 Rx (PA.10) as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* USART1 mode config */
        USART_InitStructure.USART_BaudRate = 115200;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8λÊý¾Ýλ
        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_ITConfig(USART1, USART_IT_RXNE, ENABLE);
       
        USART_Cmd(USART1, ENABLE);
}
int main(void)
{       
LED_GPIO_Config();
        Touch_Key_Init();
        USART1_Config();
        while (1)
        {               
   if(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_3)==1)
         {
                 USART_SendData(USART1,0X01);
                 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
                 GPIO_ResetBits(GPIOA,GPIO_Pin_0);
                 Delay(500000);
                 GPIO_SetBits(GPIOA,GPIO_Pin_0);
                 Delay(500000);
         }
   if(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_4)==1)
         {
                  USART_SendData(USART1,0X02);
                 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
                GPIO_ResetBits(GPIOA , GPIO_Pin_1);
                 Delay(500000);
                          GPIO_SetBits(GPIOA,GPIO_Pin_1);
                 Delay(500000);
         }
            if(GPIO_ReadInputDataBit(GPIOC , GPIO_Pin_4)==1)
         {
                 USART_SendData(USART1,0X03);
                 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
                GPIO_ResetBits(GPIOA , GPIO_Pin_2);
                 Delay(500000);
                          GPIO_SetBits(GPIOA,GPIO_Pin_2);
                 Delay(500000);
         }
            if(GPIO_ReadInputDataBit(GPIOC , GPIO_Pin_5)==1)
         {
                USART_SendData(USART1,0X04);
                 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
                GPIO_ResetBits(GPIOA , GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
                 Delay(500000);
                  GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);
                 Delay(500000);
         }
        }
}

void Delay(__IO uint32_t nCount)         //简单的延时
{
        for(; nCount != 0; nCount--);
}
如果我写的东西可以对初学者的学习有帮助,那些还是有些意义的;
如有需要板子的可以微信加我,13470015950