wormchen 发表于 2008-3-19 16:44:24

STM32入门发帖庆贺 LED流水灯

用的是英培特的EMSTM32V1学习板,按下按键后开是流水灯显示,很简单不过以前没接触过ARM还是费了好大劲!

/************************************************************************
                                        Copyright (c) 2008        陈崇                                                                                               
                                        All rights reserved                                                                                                       
文 件 名: main.c                                                                                                               
说    明: 流水灯 按下Key键开始LED1 -LED4流水显示                                                                               
主要硬件: EMSTM32V1+miniSTMV100(内部8MRC)                                                               
编译环境: MDK3.10                                                                                                               
当前版本: 1.0                                                                                                                       
作    者: 陈崇                                                                                                                       
完成日期: 2008年3月19日16:05:39                                                                                       
取代版本: 1.0                                                                                                                       
原作者: 陈崇                                                                                                               
完成日期: 2008年3月19日16:05:44                                                                               
************************************************************************/       
       
#include <stm32f10x_lib.h>

GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化结构体

/*****************************************************
函数: void Delay(vu32 nCount)
参数: vu32 nCount 延时时间
描述: 延时指定时间
返回: 无
******************************************************/
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
int main(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC时钟
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
        //选择引脚6,7,8,9
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //带上拉输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50M
        GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC6,7,8,9引脚
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能GPIOB时钟        
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9; //选择引脚9
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮点输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输入频率最大50M
        GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB9引脚

        while(1)
                {
                        if(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9))//如果按下Key开始流水
                                {
                                        while(1)
                                        {
                                                GPIO_SetBits(GPIOC, GPIO_Pin_6);//点亮LED1
                                                Delay(0x1ffff);        //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_6);//关闭LED1
               
                                                GPIO_SetBits(GPIOC, GPIO_Pin_7);//点亮LED2
                                                Delay(0x1ffff);        //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_7);//关闭LED2

                                                GPIO_SetBits(GPIOC, GPIO_Pin_8);//点亮LED3
                                                Delay(0x1ffff);        //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_8);//关闭LED3

                                                GPIO_SetBits(GPIOC, GPIO_Pin_9);//点亮LED4
                                                Delay(0x1ffff);        //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_9);//关闭LED4

                                                GPIO_SetBits(GPIOC, GPIO_Pin_8);//点亮LED3
                                                Delay(0x1ffff);        //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_8);//关闭LED3
                                               
                                                GPIO_SetBits(GPIOC, GPIO_Pin_7);//点亮LED2
                                                Delay(0x1ffff);        //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_7);//关闭LED2

                                        }
                       
                                }
                }

}
源码点击此处下载ourdev_233984.rar(文件大小:162K)

zxq6 发表于 2008-3-19 17:15:25

恭喜。

sunke9 发表于 2008-3-19 17:26:59

祝贺你!!!!!!!

tsb0574 发表于 2008-3-19 19:53:12

其实想要弄好STM32还是需要看看Cortex-M3的文档,单弄ST的FWLIB深入不了!
我开始的时候就是奇怪为什么程序不是从0x00000000或者0x8000000开始运行!
这么简单的问题就弄了好久,最后是还是看Cortex的文档才知道原来复位的时候内核自动会把向量加载然后执行。

wormchen 发表于 2008-3-19 20:23:10

tsb0574说的对,俺还是喜欢由浅入深的方式去学习。o(∩_∩)o...

Grant 发表于 2008-3-19 21:32:55

我一直在犹豫写的文档要不要写的太傻瓜了,难道客户真的什么都不懂?唉。


既然楼顶的起了个开头,我就给你再加点料,熟手勿看。

1、RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC时钟

为什么说有的CortexM3外设在配置前都要配置RCC对于的时钟?
因为CortexM3是时钟驱动型,所有的外设都被分配到不同的总线桥上,有总线来提供工作的时钟。当关闭某个外设的时钟的时候,也就意味做这个外设被关闭了,以期达到可以控制MCU电流消耗的目的。

2、RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC时钟

为什么配置C端口,需要初始化的是APB2时钟?
因为STM32有两条外设桥总线,分别为最大72Mhz的APB2和最大36Mhz的APB1,GPIO在APB2下,下图是Clock的驱动树:

1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_234275.jpg

注意图中的PCLK1和PCLK2。


额外再补一张STM32广告上示例STM32的结构图:

2http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_234276.jpg

wormchen 发表于 2008-3-20 09:37:27

Grant提供的资料很好,我也学到了很多东西。
-->“我一直在犹豫写的文档要不要写的太傻瓜了,难道客户真的什么都不懂?唉”
其实我一直在用8位单片,以前从没接触过ARM,就是看了ST广告说的编写单片机程序一样操作STM32,就又了学习的冲动,估计跟我一样的朋友也不在少数。让我一开就开始把文档手册搞懂也不太现实,所以我只能从最简单的开始,生怕打击我学习的积极性。毕竟STM32要比单片机复杂的多,对于没接触过ARM的人来说理解起来费时费力,还希望不惜吝啬Grant多写些浅显易懂的文章,供我等新手学习!
o(∩_∩)o...

kewxke 发表于 2008-3-22 16:24:14

是的,官方的文档不知道是先看ARM的还是ST的

lionliu 发表于 2008-6-6 21:10:07

MARK,谢谢

sunke9 发表于 2008-6-12 16:24:08

我是和wormchen一样的菜鸟,希望Grant这样的大侠多多指点,对你们来说很简单的事到我这里可能几天都弄不明白。

bluelucky 发表于 2008-8-11 13:02:45

以下蓝色文字由版主:bluelucky 于:2008-08-11,13:02:45 加入。<font color=black>请发贴人注意:本贴放在这分区不合适,即将移走
原来分区:ARM技术论坛
即将移去的分区:Cortex-M3技术讨论区
移动执行时间:自本贴发表0小时后
任何的疑问或咨询,请可随时联系站长。谢谢你的支持!</font>

ak0406 发表于 2008-12-28 10:32:41

我就是在时钟上面有点疑惑不解呀!Grant大哥的一席话真是说到点子上去了!恭喜楼主哈,顶起!

本贴被 ak0406 编辑过,最后修改时间:2008-12-28,10:33:43.

looker 发表于 2009-3-17 21:08:53

多谢grant的指点~~

lyg407 发表于 2012-8-24 14:39:16

不错哦。。写的蛮好的。

mdq123 发表于 2012-8-30 17:55:43

恩呢,不错不错

麦可斯乐 发表于 2012-9-22 15:30:38

多谢指点。。。

战——ing 发表于 2012-9-23 15:25:00

我也是刚开始学cortex M3的菜鸟有机会多多指教{:lol:}

hzdiy 发表于 2012-9-23 16:50:03

正准备入手STM学习!谢谢分享!!

孙为 发表于 2012-9-24 15:07:16

这还是有很多的同胞的呀,我也是刚学cortex-m3的,在此之前学过51单片机,现在手上有很多文档资料,也买了一个学习板,资料也不少,但还是不知道从哪来入手。现在把cortex-m3的权威指南看了不少,但不是太有理解,只是有一个抽象的印象。
希望给出一个合适的学习方法……

波儿 发表于 2012-10-1 16:37:48

学习了

LNSJackie 发表于 2013-5-7 22:45:30

看不懂!

我是小新mp 发表于 2013-5-9 16:55:35

最近也在弄这个。学习了{:lol:}

jiangkexiaozhen 发表于 2013-5-9 18:28:12

可喜可贺,基本就入门了;stm32点个灯都要全部都搞得差不多才行

_Funnnn 发表于 2013-5-16 01:45:21

while(1)
                                       {
                                                 GPIO_SetBits(GPIOC, GPIO_Pin_6);//点亮LED1
                                                 Delay(0x1ffff);      //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_6);//关闭LED1
               
                                                 GPIO_SetBits(GPIOC, GPIO_Pin_7);//点亮LED2
                                                 Delay(0x1ffff);      //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_7);//关闭LED2

                                                 GPIO_SetBits(GPIOC, GPIO_Pin_8);//点亮LED3
                                                 Delay(0x1ffff);      //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_8);//关闭LED3

                                                 GPIO_SetBits(GPIOC, GPIO_Pin_9);//点亮LED4
                                                 Delay(0x1ffff);      //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_9);//关闭LED4

                                                 GPIO_SetBits(GPIOC, GPIO_Pin_8);//点亮LED3
                                                 Delay(0x1ffff);      //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_8);//关闭LED3
                                                
                                                 GPIO_SetBits(GPIOC, GPIO_Pin_7);//点亮LED2
                                                 Delay(0x1ffff);      //延时
                                                GPIO_ResetBits(GPIOC, GPIO_Pin_7);//关闭LED2

                                       }


这一段有别的写法吗?这样写很难看耶,不觉得吗?我也是这样写的,,,,很不喜欢,你有别的写法吗?

hubinghuandi 发表于 2014-2-26 10:54:02

学习下,顶楼主!
页: [1]
查看完整版本: STM32入门发帖庆贺 LED流水灯