学习主题:STM32F0/F4学习和探索 小组宣言:让菜鸟都成为STM32的高手! 学习计划:本周—新品资料下载和分享、F0探索套件申请 第二周——F0/F4/F1系列产品产皮分析,开始菜鸟的学习内容 第三周——学习笔记发表和分享 第四周——开始STM32系列的DIY创意分享 菜鸟学习内容: 1. 利用4个LED实现流水灯.学习GPIO的输出控制功能. 2. 利用按键KEY3和KEY4分别控制LED1,2和LED3,4的亮灭,采用扫描方法.学习GPIO的输入功能. 3. 利用按键KEY3和KEY4分别控制LED1,2和LED3,4的亮灭,采用中断方法.学习外部中断功能. 4. 利用LCD数码显示屏显示从1自加到9999,步进值根据数字位数不同分别为1,10,100,1000.练习GPIO控制功能,熟悉LCD的编程方法. 5. 利用五维摇杆控制LCD显示数字1-5.练习GPIO的输入/输出控制功能. 6. 利用五维摇杆和LCD屏实现秒表功能.学习定时器的使用. 7. 利用PWM控制LED的亮度变化.学习定时器的PWM功能. 8. 上位机通过UART1控制LCD屏显示数字.学习UART的数据接收功能. 9. 上位机通过UART1和学习板实现简单的问答功能.学习UART的数据发送功能. 10. 利用电位器控制LCD屏显示不同电压.学习ADC功能使用. 11. 采用I2C的24C02读写实验.学习I2C功能. 12. SD卡读写实验.学习SPI功能. 13. USB简单通讯实验.学习USB功能. 小组现有成员:luweitang 队员在招人数:10人 招募条件——有愿意在STM32上努力精神! ------------------------任务完成—————————————————————————— |
STM32F051ç³»åæ°æ®æåç®ä»ï¼ä¸æï¼.pdf
下载3.5 MB, 下载次数: 9, 下载积分: ST金币 -1
STM32F4ä¸æèµæ.rar
下载3.47 MB, 下载次数: 9, 下载积分: ST金币 -1
LCDæ¾ç¤º.txt
下载2.42 KB, 下载次数: 7, 下载积分: ST金币 -1
I2C读åé¨åç¨åº.txt
下载1.6 KB, 下载次数: 8, 下载积分: ST金币 -1
串è¡éä¿¡.txt
下载6.28 KB, 下载次数: 2, 下载积分: ST金币 -1
æµæ°´ç¯ç¨åº.txt
下载2.54 KB, 下载次数: 4, 下载积分: ST金币 -1
i2c_ç¨åº.rar
下载4.81 KB, 下载次数: 5, 下载积分: ST金币 -1
æµæ°´ç¯-ç¨åº.rar
下载1.06 KB, 下载次数: 2, 下载积分: ST金币 -1
æé®æ§å¶æµæ°´ç¯çç¨åº.txt
下载3.8 KB, 下载次数: 2, 下载积分: ST金币 -1
å©ç¨STMå®æ¹ç½ç«çå½æ°å®ç°USB转串å£.txt
下载5.64 KB, 下载次数: 6, 下载积分: ST金币 -1
ä¸è§æ³¢å ³é®ä»£ç .txt
下载1008 Bytes, 下载次数: 3, 下载积分: ST金币 -1
STM32-USBå¼å.pdf
下载143.59 KB, 下载次数: 7, 下载积分: ST金币 -1
æ£å¼¦ç ´ç代ç .txt
下载1.72 KB, 下载次数: 3, 下载积分: ST金币 -1
串å£è½¬CAN-åéç¨åº.txt
下载4.83 KB, 下载次数: 2, 下载积分: ST金币 -1
串å£è½¬CAN-æ¥æ¶ç¨åº.txt
下载6.04 KB, 下载次数: 2, 下载积分: ST金币 -1
STM32çcanæ»çº¿å®éªå¿å¾.txt
下载11.42 KB, 下载次数: 2, 下载积分: ST金币 -1
回复:【ST学习小组】+STM32学习技术小组
RE:【ST学习小组】+STM32学习技术小组
这是我用先前活动搞到的开发板STM32F103。
SD-PCB图:
系统原理图:
系统框图:
还有STM32F103的中文资料。
stm32f103xä¸æèµæ.pdf
2012-6-17 07:48 上传
点击文件名下载附件
下载积分: ST金币 -13.88 MB, 下载次数: 4, 下载积分: ST金币 -1
RE:【ST学习小组】+STM32学习技术小组
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE);
GPIO_InitStruct.GPIO_Pin=MY_LED_ALL;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
//GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(MY_LED_GPIOE , &GPIO_InitStruct);
case 0:
//MY_LED_GPIOE->BRR=LED1;
//MY_LED_GPIOE->BSRR=LED4;
GPIO_SetBits(MY_LED_GPIOE,MY_LED_ALL);
GPIO_ResetBits(MY_LED_GPIOE,LED1);
break;
case 1:
//MY_LED_GPIOE->BRR=LED2;
//MY_LED_GPIOE->BSRR=LED1;
GPIO_SetBits(MY_LED_GPIOE,LED1);
GPIO_ResetBits(MY_LED_GPIOE,LED2);
break;
case 2:
//MY_LED_GPIOE->BRR=LED3;
//MY_LED_GPIOE->BSRR=LED2;
GPIO_SetBits(MY_LED_GPIOE,LED2);
GPIO_ResetBits(MY_LED_GPIOE,LED3);
break;
case 3:
//MY_LED_GPIOE->BRR=LED4;
//MY_LED_GPIOE->BSRR=LED3;
GPIO_SetBits(MY_LED_GPIOE,LED3);
GPIO_ResetBits(MY_LED_GPIOE,LED4);
break;
case 4:
GPIO_SetBits(MY_LED_GPIOE,LED4);
//GPIO_ResetBits(MY_LED_GPIOE,LED3);
break;
case 5:
//GPIO_SetBits(MY_LED_GPIOE,LED2);
GPIO_ResetBits(MY_LED_GPIOE,LED4);
break;
case 6:
GPIO_SetBits(MY_LED_GPIOE,LED4);
GPIO_ResetBits(MY_LED_GPIOE,LED3);
break;
case 7:
GPIO_SetBits(MY_LED_GPIOE,LED3);
GPIO_ResetBits(MY_LED_GPIOE,LED2);
break;
case 8:
加多一个图片吧
RE:【ST学习小组】+STM32学习技术小组
————————————LED.c-----------------------------
#include "stm32f10x_it.h"
#include "LED.h"
void LED_Init(Led_TypeDef led)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
GPIO_InitStructure.GPIO_Pin = led;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
}
void LED_Set(Led_TypeDef led, Led_SettingDef set)
{
if(set==ON)
GPIOE->BRR = led;
else
GPIOE->BSRR = led;
}
void LED_Toggle(Led_TypeDef led)
{
GPIOE->ODR ^= led;
}
-----------------LED.h--------------------------
#ifndef __LED_H
#define __LED_H
#define LED_ALL (GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5)
#define LED_GPIO_PORT GPIOE
#define LED_GPIO_CLK RCC_APB2Periph_GPIOE
typedef enum
{
ON = 1,
OFF = 0
}Led_SettingDef;
typedef enum
{
LED1 = GPIO_Pin_2,
LED2 = GPIO_Pin_3,
LED3 = GPIO_Pin_4,
LED4 = GPIO_Pin_5,
ALL_LED = (GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5)
}Led_TypeDef;
void LED_Init(Led_TypeDef led);
void LED_Set(Led_TypeDef led, Led_SettingDef set);
void LED_Toggle(Led_TypeDef led);
#endif
----------------main.c-----------------------
#include "stm32f10x_conf.h"
#include "LED.h"
int main(void)
{
Led_TypeDef led = ALL_LED;
LED_Init(led);
led = LED1;
LED_Set(led,ON);
LED_Set(led,OFF);
led = LED2;
LED_Set(led,ON);
led = ALL_LED;
LED_Toggle(led);
LED_Toggle(led);
LED_Set(led,OFF);
led = LED3;
LED_Set(led,ON);
LED_Set(led,OFF);
led = LED4;
LED_Set(led,ON);
LED_Set(led,OFF);
led = ALL_LED;
LED_Toggle(led);
return 0;
}
效果图片都同上面一样。
RE:【ST学习小组】+STM32学习技术小组
先发一个I2C的程序框图:
还有I2C的原题图:
最后的是程序:
写部分代码:
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);//发送起始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//检测EV5
I2C_Send7bitAddress(I2C1, 0xa0, I2C_Direction_Transmitter);//发送从设备地址并设置方向
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//检测EV6
I2C_SendData(I2C1, 0x05);//发送地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//检测EV8
I2C_SendData(I2C1, 0x05);//发送写数据
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//检测EV8
I2C_GenerateSTOP(I2C1, ENABLE);//发送停止信号
读代码:
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//检测EV5
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_Send7bitAddress(I2C1, 0xa0, I2C_Direction_Transmitter);//发送从设备地址并设置方向
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//检测EV6
I2C_SendData(I2C1, 0x05);//发送读地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//检测EV8
I2C_GenerateSTART(I2C1, ENABLE);//发送起始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//检测EV5
I2C_Send7bitAddress(I2C1, 0xa0, I2C_Direction_Receiver);//从地址并设置方向
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//检测EV7
I2C_SendData(I2C1, 0x05);
//while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));//检测EV7
I2C_GenerateSTOP(I2C1, ENABLE);//发送停止信号
EPROM_Rec[0] = I2C_ReceiveData(I2C1);
RE:【ST学习小组】+STM32学习技术小组
按照ST的官方ERRATA说明,要用IIC必须
1)最高优先级
2)启动DMA.
如果程序中频繁通过IIC读写的话,个人建议使用IO口模拟。
因为本人程序频繁读写,又不能设置最高优先级,
所以开始测试没问题,但是长时间运行96小时最低要求,发现ST的IIC根本不行。
改成IO口模拟,长时间运行24*30天,无问题。
小应用可以用用IIC,复杂程序下还是IO口模拟吧。
回复:【ST学习小组】+STM32学习技术小组
oid main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
| RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG
| RCC_APB2Periph_AFIO , ENABLE);
/*------------------- Resources Initialization -----------------------------*/
/* GPIO Configuration */
GPIO_Config();
/* Initialize the LCD */
STM3210E_LCD_Init();
/*------------------- Drivers Initialization -------------------------------*/
LCD_Clear(Magenta);
LCD_SetTextColor(Blue);
LCD_SetBackColor(Magenta);
while(1)
{LCD_DisplayString(50, 50, "Hello");
LCD_DisplayString(50, 80, "A R M D I Y");
LCD_DisplayString(50, 100, "Happy every day");
}
}
除了这两个程序之外,还需要字符库文件(即Ascii16为首地址的数组),可直接调用上面网址中的fonts.H文件即可,
此程序只适合驱动芯片为SS1289的LCD。
RE:【ST学习小组】+STM32学习技术小组
//Header:stm32f10x_conf.h
//FIle Name: main.c
//Author:
//Data:
#include "stm32f10x_conf.h"
#include "stm32f10x.h"
#include
int fputc(int ch, FILE *f);
void Uart1_PutChar(u8 ch);
/*************************************************
函数: void RCC_Configuration(void)
功能: 复位和时钟控制 配置
参数: 无
返回: 无
**************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量
RCC_DeInit(); //复位RCC外部设备寄存器到默认值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好
if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
RCC_PLLCmd(ENABLE); //使能PLL时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 = PLL时钟
while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
{
}
}
}
/*******************************************************************************
函数名:USART1_Configuration
输 入:
输 出:
功能说明:
初始化串口硬件设备,启用中断
配置步骤:
(1)打开GPIO和USART1的时钟
(2)设置USART1两个管脚GPIO模式
(3)配置USART1数据格式、波特率等参数
(4)使能USART1接收中断功能
(5)最后使能USART1功能
*/
void USART1_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* 第1步:打开GPIO和USART部件的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* 第2步:将USART Tx的GPIO配置为推挽复用模式 */
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);
/* 第3步:将USART Rx的GPIO配置为浮空输入模式
由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的
但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 第4步:配置USART1参数
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate = 9600;
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(USART1, &USART_InitStructure);
/* 若接收数据寄存器满,则产生中断 */
// 这次没有用到 只负责发送
// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
/* 第5步:使能 USART1, 配置完毕 */
USART_Cmd(USART1, ENABLE);
/* 如下语句解决第1个字节无法正确发送出去的问题 */
USART_ClearFlag(USART1, USART_FLAG_TC); // 清标志
}
int main(void)
{
RCC_Configuration();
// NVIC_Configuration();
USART1_Configuration();
printf("\n\rEEPW ARMDIY WW 串口1测试程序\n");
while(1)
{
}
return 1;
}
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch); /*发送一个字符函数*/
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)/*等待发送完成*/
{
}
return ch;
}
void Uart1_PutChar(u8 ch)
{
USART_SendData(USART1, (u8) ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
下一步准备实现串口的接收功能
回复:【ST学习小组】+STM32学习技术小组
这是一个使用按钮控制流水灯的程序
程序以文件txt的形式发上来吧。
æé®æ§å¶æµæ°´ç¯çç¨åº.txt
2012-6-23 20:25 上传
点击文件名下载附件
下载积分: ST金币 -13.8 KB, 下载次数: 0, 下载积分: ST金币 -1
回复:【ST学习小组】+STM32学习技术小组
有关的资料网页:
在ST官网上找到相关链接
http://www.st.com/stonline/stappl/resourceSelector/app?page=resourceSelector&doctype=FIRMWARE&ClassID=1734
在这个里面找usb相关的内容
实际的USB类库链接
http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/um0424.zip
实际的usb转串口驱动链接
http://www.st.com/cn/com/SOFTWARE_RESOURCES/SW_COMPONENT/SW_DRIVER/stm32_vcp.zip
先上图片:
RE:【ST学习小组】+STM32学习技术小组