*******由于我的板子收到的计较晚,又赶上公司这段时间忙,没有来得及及时跟大家分享
*******首先要感谢张老师做的这次活动,给了我们这些刚刚入门的实习生学习的机会,废话不多说,先来看看这个小巧的板子,太精致了哈,分享两张照片。
*******上面的板子是通上电的效果,板子上面是有一个三色的灯。拍的可能不清楚。
*******在没有拿到板子之前,我就阅读了给的材料,我就开始尝试着下载程序。刚刚要走出第一步就卡到了,我用我以前积累的软件程序下载不进去,到最后也没有找到原因,我尝试了一下“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)
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,使能中断
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);//把结构体丢到配置函数,及写入对应寄存器中
}
{
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