0

关于投票
STM32菜鸟之"零耗时键盘"及"疯狗"C++演示程序包

/*-----------------------------------------------------------------------
        STM32菜鸟之"零耗时键盘"及"疯狗"C++演示程序包

本程序主要实验目的(在EK-STM32F上通过测试):

1.时钟节拍中断
  主要体验Cortex-M3的SysTick及其中断.
2."零耗时键盘"的基本建立
  只建立了放键,短压和长压3个事件。
  压键LED亮,放键LED灭
  板上的LCD会显示相应的字符.
  例如:UP,DOWN,LEFT,RIGH,MWDG,IWDG,IRST,RST0,RST1等
3.再现C++类成员函数指针及在键盘命令表上的典型应用.
  并实现了节拍中断用普通C++类成员函数做中断函数。
4.菜农的"狗论"的现场演示
  KEY2--主程序喂狗
  KEY3--中断喂狗
  KEY4_SEL--短压键硬件喂狗,长压键不喂硬件狗
  注意:看门狗复位后LCD会每秒交替显示RST0/RST1表示看门狗复位正常(有作用)

  特别注意:下载程序后,应该将电源拔掉后再上电!!!即可演示"疯狗"~~~

菜农 HotPower@126.com   2008.2.12 16:58 于大雁塔菜地
------------------------------------------------------------------------*/

点击下载: rar

系统分类: ARM
用户分类: STM32菜鸟实习
标签: 无标签
来源: 原创
发表评论 阅读全文(1054) | 回复(0)

0

关于投票
STM32的C++类成员函数做中断函数的三个主要步骤
hotpower 发表于 2008-2-10 04:34 ST MCU ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

2楼: STM32的C++类成员函数做中断函数的三个主要步骤

1.在类中声明ISP()
class SystemObj
{
public:
//................
//类成员函数做中断函数
    static void SysTickHandler(void);//必须声明为静态函数!!!
public:
    volatile unsigned int RamTest;
    union
    {
        volatile unsigned char WorkFlag;
        struct
        {
            unsigned char Watchdog:         1;//允许喂狗
            unsigned char SysTickFlag:      1;//节拍中断
            unsigned char MainLoopFlag:     1;//主循环运行
            unsigned char MainWatchdog:     1;//主循环喂狗
        };
    };
};

2.构造类成员函数
//节拍中断服务程序(类成员函数做中断函数)
//static//此处不能加static!!!
//类成员变量必须指明实际的类!!!(System.SysTickFlag 不能写成SysTickFlag )
void SystemObj::SysTickHandler(void)
{
    Keyboard.Exec();//"零耗时键盘"消抖及运行命令
    System.SysTickFlag = true;//通知主循环节拍中断正常工作
}

3.在stm32f10x_vector.c内的中断向量表内填写需要中断的类成员函数地址
const __root intvec_elem __vector_table[] =
{
  { .__ptr = __sfe( "CSTACK" ) },
  __program_start,
  NMIException,
  HardFaultException,
  MemManageException,
  BusFaultException,
  UsageFaultException,
  0, 0, 0, 0,            /* Reserved */
  SVCHandler,
  DebugMonitor,
  0,                      /* Reserved */
  PendSVC,
//  SysTickHandler,
  &SystemObj::SysTickHandler,
//不能用下列写法
//  &System.SysTickHandler,
  WWDG_IRQHandler,
  PVD_IRQHandler,
//..........................
};

注意: &SystemObj::SysTickHandler替换了原先的SysTickHandler
即饶过了stm32f10x_it.c内的空函数SysTickHandler()
用SystemObj::SysTickHandler()替代为新的节拍中断函数

系统分类: ARM
用户分类: STM32菜鸟实习
标签: 无标签
来源: 原创
发表评论 阅读全文(530) | 回复(0)

0

关于投票
关于STM32中IAR环境下如何包含C++头文件及中断函数问题
目前Cortex M3的两种MCU主要有STM32和LM3S系列.
它们都可以在IAR环境下用C++编写程序,但略有差异.
由于Cortex M3的中断函数和其他MCU/ARM/DSP不同,它实际是一个普通函数.
它们在IAR环境下的中断向量表用C的数组表示很有特点,不像以往都是用汇编.
正因为中断函数是普通的函数,那么对于C++中类的成员函数作为普通的中断函数将会比其他容易的多.
这样C++在MCU上的编程就更合理和完美了~~~
虽然STM32在stm32f10x_vector.c中定义了中断向量表并在stm32f10x_it.c内
构造了所有的中断空函数.

再一个问题就是包含C++头文件的问题.
在LM中C++头文件<string>,<cstdlib>等可以放如一个公共头文件中大家引用.
而在STM32中这些C++头文件只能放入各自的CPP文件的头部引用,否则将编译出错!!!

为什么要用C++呢???起码string会很方便的~~~
系统分类: ARM
用户分类: STM32菜鸟实习
标签: 无标签
来源: 原创
发表评论 阅读全文(316) | 回复(0)

0

关于投票
开漏双向IO在模拟串行通信和IO自检方面的优势

原文发表于: http://bbs.21ic.com/club/bbs/list.asp?boardid=49&t=2832973

hotpower 发表于 2008-1-16 22:15 ST MCU ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖


10楼: 开漏双向IO在模拟串行通信和IO自检方面的优势

8031的准双向IO的成功,也支持了它能在业界存活的时间更长,当然AT89C51
是后继者中最大的功臣~~~

准双向IO实际就是带上拉功能的开漏输出且能读写的双向IO,它在速度允许时,

几乎可以模拟任何串行接口,特别是将SPI接口的MISO和MOSI短接变为单线双向

接口SIO.

虽然它的拉电流很小,但对保护IO不受损坏起到了关键的作用.

如果大家都是这种准双向的IO接口,那么大家线与又有谁害怕IO被毁呢???

所以这种准双向IO的优点就可以实现IO的自检,在配合下面的"电路"即可实现

IO不怕接VCC,不怕接地,不怕混线,不怕断线(过孔未沉铜)~~~

即可在一片IO上用铁棍"弹钢琴"~~~

"电路"

V---自恢复保险---+----LDO----MCU---IO <---搞破坏(VCC,GND,...)
                 |                 
            瞬态拟制器
                 |
                GND

STC单片机IO管脚毁坏动态自检程序

系统分类: ARM
用户分类: STM32菜鸟实习
标签: 无标签
来源: 原创
发表评论 阅读全文(390) | 回复(0)

0

关于投票
Firmware Lib的应用及C++工程建立过程杂谈

原贴发表于: http://bbs.21ic.com/club/bbs/list.asp?boardid=49&t=2830470

hotpower 发表于 2008-1-14 11:24 ST MCU ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖


楼主: Firmware Lib的应用及C++工程建立过程杂谈

Firmware Lib的应用及C++工程建立过程杂谈

Firmware Lib下载地址:
http://www.st.com/stonline/products/support/micro/files/um0427.zip

Firmware Lib用户手册下载地址:
http://www.st.com/stonline/products/literature/um/13475.pdf

IAR环境Firmware Lib的目录在
$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\library\中

由于版本的问题,一般应用都重建一个
$PROJ_DIR$\..\..\library\中

在$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\中有3个关键的文件夹


1.$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\library\
里面有2个重要目录
\inc
\src

2.$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\project\
我们新建工程可以用此当作模板直接拷贝修改即可

3.$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\examples\
内部存放着我们需要的一些常用例程
它一般含有
main.c 用户主程序,它最终是在$PROJ_DIR$\..\..\project\中
readme.txt
stm32f10x_conf.h 模块的配置文件
stm32f10x_it.h
stm32f10x_it.c   用户中断服务程序填加文件
可以将此复制到我们自己的$PROJ_DIR$\..\..\project\中

用户的工程应该在$PROJ_DIR$\..\..\project\EWARM\下建立
它重要含有
cortexm3_macro.s 启动文件
stm32f10x_vector.c 用户向量文件

lnkarm_flash.xcl
注意它在菜单Option->linker->config->Linker command file里要填入
$PROJ_DIR$\lnkarm_flash.xcl
这样即可在出现在工程菜单Workspace->BOOT_FLASH中的Output里
注意:
要在Option->C/C++ Compiler->Defined Symbols里填写VECT_TAB_FLASH

lnkarm_ram.xcl
注意它在Option->linker->config->Linker command file里要填入
$PROJ_DIR$\lnkarm_ram.xcl
这样即可在出现在Workspace->BOOT_RAM中的Output里
注意:
要在Option->C/C++ Compiler->Defined Symbols里填写VECT_TAB_RAM

BOOT_FLASH,BOOT_RAM可在菜单Project->Edit Configurations里添加和删除
这样即可运行在FLASH或RAM环境中

工程选项的主要配置问题
进入此菜单的方法有3个
1. Alt+F7
2. 在菜单的Project下选择Option
3。在Workspace右键选择Option

临时填加stm32f10x_conf.h内没有配置的选项
在Option->C/C++ Compiler->Defined Symbols里
填写_ADC1 等同在stm32f10x_conf.h里#define _ADC1

填写_GPIOA 等同在stm32f10x_conf.h里#define _GPIOA

关于Hex或Bin文件的生成输出问题

1.在选项栏里直接填入需要的文件
在Option->Linker->Output->Output file下选择Override default
填入:文件名.文件类型
例如: test.hex或test.bin

这种方法虽然很方便,但是可能随手点击Override default使
文本框内的文字变为:工程名.d79

2.在xcl文件里填入所需的文件类型
在BOOT_RAM下要填入lnkarm_ram.xcl文件中
在BOOT_FLASH下要填入lnkarm_flash.xcl文件中

可以直接在其文件的尾部填入
-Ointel-extended,(CODE)=.hex//输出hex文件

-Oraw-binary,(CODE)=.bin//输出bin文件
注意只能选择其一!!!

这种方法虽然"返古",但却是"永垂不朽"的~~~

用户指定固件库的配置问题
1.头文件引用声明
在Option->C/C++ Compiler->Preprocessor->Additional include directories
填入
$PROJ_DIR$\..\
$PROJ_DIR$\..\..\library\inc

2.库文件引用声明
在Option->Linker->Config Search paths
填入
$TOOLKIT_DIR$\LIB\
$PROJ_DIR$\..\..\library\src\


关于C++的配置问题

1.选择C++编译器
在Option->C/C++ Compiler->Language->Language下
选择
Embedded C++

Extended Embedded C++

在Option->C/C++ Compiler->Language->Language conformance下选择
Allow IAR exensions

这样即可支持__low_level_init(),从而可是全局变量复位后不初始化为0
例如:
extern "C" __root char __low_level_init (void)
{
  stm32_Init();//抢在类析构函数和main()前初始化
  return 0;//0-变量不初始化,1-变量初始化
}
SystemObj System;
LcdObj    Lcd;

int main()
{
  return 0;
}

再谈C++中变量不初始化为0的问题
在IAR中,本身就有__no_init修饰符可以阻止对变量的初始化
但是在C++中,对整个类使用__no_init修饰符将造成类不能析构
即分配类后将不能自动调用类的析构函数即类的初始化函数。
再者工控中需要很多需要初始化不变的变量用于现场参数的记忆。
而C++的类成员变量也需要此功能。

故干脆重载__low_level_init()使任何变量不初始化。
注意__low_level_init()返回0即可达到此目的!!!切记!!!
再注意__low_level_init()是在类析构函数和main()前运行的。
这样就可提前进行些系统的初始化,如__low_level_init()内的stm32_Init();

类分配顺序问题
在C++中,分配顺序顺序极为重要!!!
因为它是在__low_level_init()后而在main()前运行的!!!
由于硬件的关系,所以运行及分配的顺序很重要

申请反了可能带来意想不到的后果!!!!

哈哈,大雪封山,先杂谈到这里,俺要继续种地了~~~

菜农 HotPower@126.com  2008.1.14 10:58 杂谈于雁塔菜地中

系统分类: ARM
用户分类: STM32菜鸟实习
标签: 无标签
来源: 原创
发表评论 阅读全文(334) | 回复(0)

0

关于投票
STM32菜鸟之IAR环境下的C++演示程序包

/*-----------------------------------------------------------------------
        STM32菜鸟之IAR环境下的C++演示程序包

本程序主要是IAR环境下C++工程的建立,LED/LCD显示及按钮/操作杆的中断.
从而完成IO/中断/定时这菜鸟进化过程中比较重要的前两项,为STM32菜鸟
毕业打下了基础~~~

本程序引用了C++最基本也是不可缺少的内容,多了肯定要被拍砖的~~~
不过C++用于MCU/ARM/DSP俺菜农全用了,而且感觉很爽~~~

哈哈,在近代"生活条件不错时",为何还要过我们那个年代的"苦日子"???
string类不爽吗???class的封装,析构,多态,内联等等不方便吗???

本程序实际是把STM32的LCDDemo简单地拼凑成C++程序,由于俺还在菜鸟阶段
故以调通程序和熟悉固件库为目的,所以拍砖者也别追究俺什么C++用的不当
或不妥刑事责任~~~

要知道自己建立C++工程有多么倒塌才是...俺还没见过网上有什么例程~~~
哈哈~~~还是不见为好,自己琢磨的是不会忘记的,这就是俺菜鸟进化的硬道理.

注: 本压缩包目录E:\Manley\EKBoard\EKSTM32F\

菜农 HotPower@126.com   2008.1.13 6:58 于大雁塔菜地的雪地中
------------------------------------------------------------------------*/

点击下载C++演示程序包CPPDemo.rar    rar

 

系统分类: ARM
用户分类: