luweitang 发表于 2012-6-9 07:13:55

【ST学习小组】+STM32学习技术小组

  学习主题: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上努力精神!
 
------------------------任务完成——————————————————————————

阿呆 发表于 2012-6-14 14:19:52

回复:【ST学习小组】+STM32学习技术小组

加油,赶快招募到队员呐!!!

luweitang 发表于 2012-6-17 07:43:20

RE:【ST学习小组】+STM32学习技术小组

【ST学习小组】STM32学习技术小组(6月17号更新)
这是我用先前活动搞到的开发板STM32F103。
 
SD-PCB图:

 
系统原理图:

 
系统框图:

还有STM32F103的中文资料。
 

luweitang 发表于 2012-6-17 07:49:26

RE:【ST学习小组】+STM32学习技术小组

流水灯代码:简单GPIO应用,发现各种模式都适用流水灯.这是部分的代码!

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:
 
加多一个图片吧

luweitang 发表于 2012-6-18 22:22:44

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;
}
效果图片都同上面一样。

luweitang 发表于 2012-6-19 22:06:34

RE:【ST学习小组】+STM32学习技术小组

今天采用I2C的24C02读写实验.学习I2C功能.
 
先发一个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 = I2C_ReceiveData(I2C1);
 

luweitang 发表于 2012-6-19 22:41:20

RE:【ST学习小组】+STM32学习技术小组

STM32读写EEPROM驱动,硬件I2C中断加DMA方式。



按照ST的官方ERRATA说明,要用IIC必须
1)最高优先级
2)启动DMA.
如果程序中频繁通过IIC读写的话,个人建议使用IO口模拟。
因为本人程序频繁读写,又不能设置最高优先级,
所以开始测试没问题,但是长时间运行96小时最低要求,发现ST的IIC根本不行。
改成IO口模拟,长时间运行24*30天,无问题。
小应用可以用用IIC,复杂程序下还是IO口模拟吧。
 

luweitang 发表于 2012-6-20 19:01:25

回复:【ST学习小组】+STM32学习技术小组

今日学习LCD显示。
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。

luweitang 发表于 2012-6-22 06:27:58

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);
}

 
下一步准备实现串口的接收功能

 

luweitang 发表于 2012-6-23 20:25:15

回复:【ST学习小组】+STM32学习技术小组


这是一个使用按钮控制流水灯的程序
程序以文件txt的形式发上来吧。
 
页: [1] 2
查看完整版本: 【ST学习小组】+STM32学习技术小组