打印
[信息]

【版主申请】+STM32,很有前(钱)途(STM32的使用问题,可以问我

[复制链接]
楼主: pattywu
手机看帖
扫描二维码
随时随地手机跟帖
41
pattywu|  楼主 | 2013-12-3 18:47 | 只看该作者 回帖奖励 |倒序浏览
wqx0532 发表于 2013-12-3 14:51
支持你, 到时候我们就可以学习用C++写程序了

谢谢支持

使用特权

评论回复
42
xzhihui| | 2013-12-3 20:03 | 只看该作者
支持!
想用C++来写单片机。

使用特权

评论回复
43
max_v| | 2013-12-3 20:49 | 只看该作者
用C++有啥优势么?

使用特权

评论回复
44
pattywu|  楼主 | 2013-12-4 09:49 | 只看该作者
xzhihui 发表于 2013-12-3 20:03
支持!
想用C++来写单片机。

谢谢支持。

使用特权

评论回复
45
pattywu|  楼主 | 2013-12-4 14:58 | 只看该作者
max_v 发表于 2013-12-3 20:49
用C++有啥优势么?

你还是先了解一下C++吧。

使用特权

评论回复
46
pattywu|  楼主 | 2013-12-5 12:47 | 只看该作者
再上点料:用C++实现的DMA类.
dma.rar (1.78 KB)

使用特权

评论回复
47
pattywu|  楼主 | 2013-12-5 15:34 | 只看该作者
一、配置串口:
STM32的串口多处理器(地址)模式的处理过程:
1、正常配置串口(波特率、9位模式、1位停止位、无检验、无流控、使能接收/发送):USART_Init();
2、设置本机设备地址:USART_SetAddress();
3、设置地址模式(USART_WakeUp_AddressMark):USART_WakeUpConfig();
4、配置中断(TC、RXNE、IDLE):USART_ITConfig();
5、使能唤醒:USART_ReceiverWakeUpCmd()

二、中断处理:
1、在接收到第一个字节(地址)数据,除能唤醒(间接地让IDLE中断生效):USART_ReceiverWakeUpCmd()
2、正常的发送与接收;
3、当有空闲标志时,再次使能唤醒:USART_ReceiverWakeUpCmd();

三、发送:
发送时,第一个字节或上0x100:Usart_SendChar(data[0]|0x100);

全部过程写完,记得要顶哦。*_*

使用特权

评论回复
48
dong_abc| | 2013-12-5 23:31 | 只看该作者
pattywu 发表于 2013-12-5 15:34
一、配置串口:
STM32的串口多处理器(地址)模式的处理过程:
1、正常配置串口(波特率、9位模式、1位 ...

发个demo呗。

使用特权

评论回复
49
pattywu|  楼主 | 2013-12-5 23:53 | 只看该作者
dong_abc 发表于 2013-12-5 23:31
发个demo呗。

工程太复杂,不好单独给出来。
就给主要的文件吧。 多处理器串口.rar (3.4 KB)



使用特权

评论回复
50
dong_abc| | 2013-12-5 23:57 | 只看该作者
本帖最后由 dong_abc 于 2013-12-6 00:13 编辑
pattywu 发表于 2013-12-5 23:53
工程太复杂,不好单独给出来。
就给主要的文件吧。


只需要能点个灯就可以了。



使用特权

评论回复
51
dong_abc| | 2013-12-6 00:05 | 只看该作者
本帖最后由 dong_abc 于 2013-12-6 00:09 编辑

我之前也想写一套模板的,只是这两年工作上没怎么写单片机程序,再加上C++学得一知半解,迟迟没动手。不习惯你的风格:lol

使用特权

评论回复
52
pattywu|  楼主 | 2013-12-6 11:47 | 只看该作者
dong_abc 发表于 2013-12-6 00:05
我之前也想写一套模板的,只是这两年工作上没怎么写单片机程序,再加上C++学得一知半解,迟迟没动手。不习 ...

谢谢支持。

使用特权

评论回复
53
max_v| | 2013-12-6 15:54 | 只看该作者
pattywu 发表于 2013-11-30 19:46
谢谢。
    这就如同我当年翻译《WTL起步-玩转图形界面》一样,初期是累一点,但以后出产品就快多了 ...

很牛X啊,在微软混过;P

使用特权

评论回复
54
kenmy| | 2013-12-6 17:23 | 只看该作者
有前途,支持哈

使用特权

评论回复
55
pattywu|  楼主 | 2013-12-6 23:35 | 只看该作者
max_v 发表于 2013-12-6 15:54
很牛X啊,在微软混过

谢谢支持。

使用特权

评论回复
56
pattywu|  楼主 | 2013-12-6 23:35 | 只看该作者
kenmy 发表于 2013-12-6 17:23
有前途,支持哈

谢谢支持。

使用特权

评论回复
57
pattywu|  楼主 | 2013-12-8 00:08 | 只看该作者
发个时钟配置RCC的C++实现。
rcc.rar (3.38 KB)

使用特权

评论回复
58
ahuzjh| | 2013-12-8 15:21 | 只看该作者
支持楼主做版主,太有经验了。

使用特权

评论回复
59
pattywu|  楼主 | 2013-12-8 19:37 | 只看该作者
ahuzjh 发表于 2013-12-8 15:21
支持楼主做版主,太有经验了。

谢谢支持.

使用特权

评论回复
60
pattywu|  楼主 | 2013-12-8 20:23 | 只看该作者
本帖最后由 pattywu 于 2013-12-8 20:44 编辑

【原创】

本帖教你如何用Cortex-M的MemManage_Fault,在确定某一款MCU的SRAM的大小。

在Cortex-M处理器中,有一个系统中断(Fault),叫存储器管理Fault。看过《ARM Cortex-M3 权威指南》的开发者,应该能查到这个Fault。

1、在初始化内存时,读取SRAM中的数据,边界为了1K字节或2K字节。绝大部分的MCU中,SRAM的设计,是以2K字节为单位的。比如:2K、4K、6K、8K、10K、12K、16K、20K、24K、32K、48K、64K、96K、128K等等。

2、当读取的数据地址不存在于SRAM中时,会发生MemManage_Fault。如果没有使能MemManage_Fault时,就会引发Hard_Fault。

3、MemManage_Fault或Hard_Fault的处理过程:
MemManage_Handler PROC
        EXPORT MemManage_Handler
      
        MRS R0, MSP                         ; 读MSP
        LDR R1, [R0,#24]                    ; 读PC值
        ADD R1,#2                           ; PC+2,路过内存访问的指令
        STR R1, [R0,#24]                    ; PC的值写回到堆栈中

        BX   LR                             ; 中断返回到线程模式,使用PSP

               ENDP

4、获取SRAM大小的处理过程:
#define SRAM_BASE            0x20000000     // 定义内存的基址,(存在MCU的SRAM的基地址不为0x20000000的)

int GetMemSize()                           // 初始化全局内存池      
{
        int i, j=0;
        u32* p;
        u32 val=0x12345679;
      
        p=(u32*)SRAM_BASE;                      // 取SRAM基地址,宏定义:0x20000000(有些)

        for(i=1; i<=1024; i++)                   // 1024*2K
        {
                p += 512;                        // 512字(2K字节)为单位
                if(val != *p)                    // 读出来数据
                {
                        val = *p;                // MemFault时,相当于没读数据
                }
                else                             // 如果数据相同
                {
                        j = *(u32*)0xe000ed34;   // Fault后,保存的数据地址
                        if(j == (u32)p)           // 数据地址相同与本次访问的地址相同
                        {
                                break;             // 跳出
                        }
                }
        }
        return (j-SRAM_BASE);                     // 首次MemManage_Fault的地址,就是SRAM内存的最大地址
}

5、需要解释一下的是:当发生MemManage_Fault时,地址0xe000ed34处保存有引发MemManage_Fault时的内存地址。

6、说个小秘密:经检测,STM32F103VC的SRAM,不是手册上的48K,而是64K,FLASH也不是手册上的256K,而是512K.

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
dong_abc + 6
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则