打印
[M051]

M051初始化项目向导

[复制链接]
楼主: X-Hawk
手机看帖
扫描二维码
随时随地手机跟帖
21
gfs0521| | 2012-8-29 08:21 | 只看该作者 回帖奖励 |倒序浏览
非常不错,呵呵,但如果能将部分功能分开就更好

使用特权

评论回复
22
pigedong| | 2012-8-31 20:51 | 只看该作者
谢谢!如AVR的ICCAVR一样的吗?

使用特权

评论回复
23
pigedong| | 2012-8-31 21:10 | 只看该作者
如果有离线版就好啦,在公司不能上网^_^

使用特权

评论回复
24
xinhurenfengsl| | 2012-11-13 19:44 | 只看该作者
是很强大啊

使用特权

评论回复
25
wu81702366| | 2012-11-30 14:16 | 只看该作者
不错

使用特权

评论回复
26
cgd| | 2012-11-30 15:10 | 只看该作者
顶,很强悍!

使用特权

评论回复
27
pcwebmaster| | 2012-12-12 16:47 | 只看该作者
很好,能不能做成单机版的?这样上不了网也能使用。

使用特权

评论回复
28
缥缈九哥| | 2012-12-15 11:02 | 只看该作者
洒鬼大作,顶起呀。

使用特权

评论回复
29
qdwygdwxf| | 2012-12-27 14:46 | 只看该作者
你好!请教个问题,我用M0定时0中断进不去,自己写的头文件,启动函数没有动,中断函数名跟启动文件里一样的,有中断标志,怎么回事

使用特权

评论回复
30
qdwygdwxf| | 2012-12-27 14:47 | 只看该作者
#include "nano1xx.h"
#include <stdint.h>
void sys_init(void)
{
       
                RST_SRC = 0x00000000;        // 系统复位寄存器清0       
          TEMPCTL = 0x000000AA;        // 禁止温度传感器功能清0
                RegLockAddr = 0x00000059;        // 解除寄存器保护序列
                RegLockAddr = 0x00000016;
                RegLockAddr = 0x00000088;               
                PORCTL = 0x5AA5;                         // 禁止上电复位        
                BODCTL = 0x00000000;         // 掉电检测不使能
                BODSTS = 0x00000000;        // 掉电测试不使能
                VREFCTL = 0x00000F00;        // 基准电压不使能       

}
void colk_init(void)
{
                IRCTRIMCTL = 0x00000000;        // 禁用HIRC微调功能
                IRCTRIMIEN = 0x00000000;        // 禁用HIRC中断       
                CLKSTATUS = 0x00000000;
                while(!CLKSTATUSBIT -> LIRC_STB);
        do{
                RegLockAddr = 0x00000059;        // 解除寄存器保护序列
                RegLockAddr = 0x00000016;
                RegLockAddr = 0x00000088;               
                PWRCTL = 0x0000031D;                        // 禁用掉电模式,LIRC_EN,HXT_EN使能,HIRC_EN禁用
                AHBCLK = 0x00000031;                        // 系统时钟使能,SRAM控制器时钟使能,GPIO_EN时钟使能
                                                                                                                        // EBI_EN、ISP_EN、DMA_EN禁止
               
                APBCLK = 0x1001013D;        // ADC,UART0,TMR2-3,WDT时钟使能
                CLKSEL1 = 0x000400F2; // TMR0-1,选择HXT时,UART_S,ADC_S选择PLL时钟
                CLKSEL2 = 0x000F88FB; // TMR2-3,选择HXT时钟,时钟分频时钟源选择HCLK
                CLKDIV0 = 0x00000000; // 分频器不分频
                CLKDIV1 = 0x00000000; // 分频器不分频
                PLLCTL = 0x0000FEC0;        // PLL时钟24MHz
                FRQDIV = 0x00000010;        // 分频器使能,分频选择1/2
                RegLockAddr = 0x00000059;        // 解除寄存器保护序列
                RegLockAddr = 0x00000016;
                RegLockAddr = 0x00000088;       
                CLKSEL0 = 0x00000010;        // HCLK选择PLL时钟
        }while(!CLKSTATUSBIT -> HXT_STB);        // 判断HXT_STB时钟是否稳定

}
void wdt_init(void)
{
                RegLockAddr = 0x00000059;        // 解除寄存器保护序列
                RegLockAddr = 0x00000016;
                RegLockAddr = 0x00000088;
                WDT_CTL = 0x00000070;
                WDT_IER = 0x00000000;        // 禁用看门狗定时中断
          WDT_ISR = 0x00000000;
}
void GPIO_SET(void)
{
/*******************GPIOA_SET***********************/
        PA_L_MFP = 0x11111111; // 设置PA端口低8位为AD
        PA_H_MFP = 0x00000000; // 设置PA端口高8位为GPIO.
        GPIOA_PMD = 0x00000000; // 设置PA端口为输入模式
        GPIOA_PUEN = 0x00000000; // GPIOA无上拉
        GPIOA_OFFD = 0x00000000; // 关闭数字输入
        GPIOA_DOUT        = 0x00000000; // 数据输出为低
        GPIOA_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOA_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOA_DBEN = 0x00000000; // 禁止防反弹
        GPIOA_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOA_IER = 0x00000000; // 禁止中断使能
        GPIOA_ISR = 0x00000000; // 中断状态寄存器清0
/*******************GPIOB_SET***********************/       
        PB_L_MFP = 0x00000000; // 设置PB端口低8位为GPIO
        PB_H_MFP = 0x00000000; // 设置PB端口高8位为GPIO
        GPIOB_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOB_PUEN = 0x00000000; // GPIOB无上拉
        GPIOB_OFFD = 0x00000000; // 关闭数字输入
        GPIOB_DOUT        = 0x00000000; // 数据输出为低
        GPIOB_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOB_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOB_DBEN = 0x00000000; // 禁止防反弹
        GPIOB_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOB_IER = 0x00000000; // 禁止中断使能
        GPIOB_ISR = 0x00000000; // 中断状态寄存器清0
/*******************GPIOC_SET***********************/       
        PC_L_MFP = 0x00000000; // 设置PC端口低8位为GPIO
        PC_H_MFP = 0x00000000; // 设置PC端口高8位为GPIO
        GPIOC_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOC_PUEN = 0x00000000; // GPIOB无上拉
        GPIOC_OFFD = 0x00000000; // 关闭数字输入
        GPIOC_DOUT        = 0x00000000; // 数据输出为低
        GPIOC_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOC_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOC_DBEN = 0x00000000; // 禁止防反弹
        GPIOC_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOC_IER = 0x00000000; // 禁止中断使能
        GPIOC_ISR = 0x00000000; // 中断状态寄存器清0
/*******************GPIOD_SET***********************/       
        PD_L_MFP = 0x00000000; // 设置PC端口低8位为GPIO
        PD_H_MFP = 0x00000000; // 设置PC端口高8位为GPIO
        GPIOD_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOD_PUEN = 0x00000000; // GPIOB无上拉
        GPIOD_OFFD = 0x00000000; // 关闭数字输入
        GPIOD_DOUT        = 0x00000000; // 数据输出为低
        GPIOD_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOD_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOD_DBEN = 0x00000000; // 禁止防反弹
        GPIOD_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOD_IER = 0x00000000; // 禁止中断使能
        GPIOD_ISR = 0x00000000; // 中断状态寄存器清0拉
/*******************GPIOE_SET***********************/       
        PE_L_MFP = 0x00000000; // 设置PC端口低8位为GPIO
        PE_H_MFP = 0x00000000; // 设置PC端口高8位为GPIO
        GPIOE_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOE_PUEN = 0x00000000; // GPIOB无上拉
        GPIOE_OFFD = 0x00000000; // 关闭数字输入
        GPIOE_DOUT        = 0x00000000; // 数据输出为低
        GPIOE_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOE_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOE_DBEN = 0x00000000; // 禁止防反弹
        GPIOE_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOE_IER = 0x00000000; // 禁止中断使能
        GPIOE_ISR = 0x00000000; // 中断状态寄存器清0
/*******************GPIOF_SET***********************/       
        PF_L_MFP = 0x00000000; // 设置PC端口低8位为GPIO
        GPIOF_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOF_PUEN = 0x00000000; // GPIOB无上拉
        GPIOF_OFFD = 0x00000000; // 关闭数字输入
        GPIOF_DOUT        = 0x00000000; // 数据输出为低
        GPIOF_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOF_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOF_DBEN = 0x00000000; // 禁止防反弹
        GPIOF_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOF_IER = 0x00000000; // 禁止中断使能
        GPIOF_ISR = 0x00000000; // 中断状态寄存器清0
}
void TMR0_SET(void)
{
        RegLockAddr = 0x00000059;        // 解除寄存器保护序列
        RegLockAddr = 0x00000016;
        RegLockAddr = 0x00000088;
        TMR_CTL0 = 0x00000012; // 周期定时模式,复位预分频器计数器
        TMR_PRECNT0 = 0x00000000; // 预分频不分频
        TMR_CMPR0 = 0x0000FFFF; // 定时器比较80
        TMR_IER0 = 0x00000001; // 定时器中断使能
        TMR_ISR0 = 0x00000000; // 定时器中断状态清0
        TMR_DR0 = 0x00000000; // 定时器处置为0
        MCU_IRQ = 0x00000000;
        NVIC_ISER = 0x00000100; // 使能中断号8
        NMI_SEL = 0x00000008;        // 选择中断号8,定时器0
        NVIC_IPR2 = 0x000000C0; // IRQ7优先低优先级
        TMR_CTL0BIT -> TMR_EN = 0x01; // 定时器启动
}
void TMR0_IRQHandler(void)
{
        TMR_ISR0 = 0x00000000;
        GPIOE6 = !GPIOE6;
}
unsigned long i;
main (void)
{
        sys_init();        // 系统初始化
        colk_init();        // 时钟初始化
        wdt_init();        // 看门狗初始化
        GPIO_SET();        // IO 口初始化
        TMR0_SET();
  while(1)
  {
        /*        GPIOE6 = 0x01; // GPIOE6 输出为高
                for(i=0;i<0x0000FFFF;i++);
                GPIOE6 = 0x00; // GPIOE6 输出为低
                for(i=0;i<0x0000FFFF;i++);*/
  }
}

使用特权

评论回复
31
qdwygdwxf| | 2012-12-27 14:48 | 只看该作者
;/*---------------------------------------------------------------------------------------------------------*/
;           启动代码作用一般是:1)堆和栈的初始化;2)向量表定义;3)地址重映射及中断向量表的转移;
;      4)设置系统时钟频率;5)中断寄存器的初始化;6)进入C应用程序。
Stack_Size      EQU     0x00000500                                                    ;         定义Stack_Size为0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3   ;定义栈,可初始为0,8字节对齐
Stack_Mem       SPACE   Stack_Size                                                    ;分配0x200个连续字节,并初始化为0

__initial_sp                                                                                                ;汇编代码地址标号


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000500                                                          ;定义Heap_Size为0x00000000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3          ;定义堆,可初始为0,8字节对齐
__heap_base
Heap_Mem        SPACE   Heap_Size                                                          ;分配0x00个连续字节,并初始化为0
__heap_limit


                PRESERVE8                                                                 ; 指定当前文件堆栈8字节对齐
                THUMB                                                                         ; 告诉汇编器下面是32为的Thumb指令,如果需要汇编器将插入位以保证对齐


; Vector Table Mapped to Address 0 at Reset
;以下中断向量表定义
                AREA    RESET, DATA, READONLY                ;定义复位向量段,只读
                EXPORT  __Vectors                                        ; 定义一个可以在其他文件中使用的全局标号。此处表示中断地址

__Vectors       DCD     __initial_sp              ; Top of Stack          给__initial_sp分配4字节32位的地址0x0
                DCD     Reset_Handler             ; Reset Handler          给标号Reset Handler分配地址为0x00000004
                DCD     NMI_Handler               ; NMI Handler                  给标号NMI Handler分配地址0x00000008
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     0                         ; Reserved                   这种形式就是保留地址,不给任何标号分配
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     SVC_Handler               ; SVCall Handler
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     PendSV_Handler            ; PendSV Handler
                DCD     SysTick_Handler           ; SysTick Handler

                ; External Interrupts
                                                  ; maximum of 32 External Interrupts are possible
                DCD     BOD_IRQHandler  
                DCD     WDT_IRQHandler  
                DCD     EINT0_IRQHandler
                DCD     EINT1_IRQHandler
                DCD     GPIOP0P1_IRQHandler
                DCD     GPIOP2P3P4_IRQHandler
                DCD     PWMA_IRQHandler
                DCD     PWMB_IRQHandler
                DCD     TMR0_IRQHandler
                DCD     TMR1_IRQHandler
                DCD     TMR2_IRQHandler
                DCD     TMR3_IRQHandler
                DCD     UART0_IRQHandler
                DCD     UART1_IRQHandler
                DCD     SPI0_IRQHandler
                DCD     SPI1_IRQHandler
                DCD     Default_Handler
                DCD     Default_Handler
                DCD     I2C_IRQHandler
                DCD     Default_Handler
                DCD     Default_Handler
                DCD     Default_Handler
                DCD     Default_Handler
                DCD     Default_Handler  
                DCD     Default_Handler  
                DCD     Default_Handler
                DCD     Default_Handler
                DCD     Default_Handler
                DCD     PWRWU_IRQHandler
                DCD     ADC_IRQHandler
                DCD     Default_Handler  
                DCD     Default_Handler  
                              
  ; 中断向量表的转移            
               
                AREA    |.text|, CODE, READONLY                                 ;        代码段定义
               
                              
; Reset Handler
               
                ;ENTRY
               
Reset_Handler   PROC                                                           ;  标记一个函数的开始 (这里是复位子程序从0x04开始

                EXPORT  Reset_Handler             [WEAK]         ;将Reset_Handler设为外部可引用的标号
                                                                         ; [WEAK] 选项表示当所有的源文件都没有 定义这样一个标号时,
                                                                                                                         ;编译器也不给出错误信息,在多数情况下将该标号置为 0 ,
                                                                                                                         ;若该标号为 B 或 BL 指令引用,则将 B 或 BL指令置为 NOP 操作。
                                                                                                                         ;EXPORT提示编译器该标号可以为外部文件引用。
                                                                                                                         
                                ;IMPORT  SystemInit                                  [WEAK]     ;在自建工程时一般会出现这一行 ,并在复位子程序结束处跳到MAIN前
                                                                             ;会先跳到这个初始化程序,如果你的主程序里没有这一初始化程序
                                                                                                                         ;而是在MAIN中初始化,将会导致编译器因找不到这一程序而报错
                                                                                                                         ;解决的办法是注解这一行,或加上 [WEAK]
                                                                                                                         ;当然后面跳到MAIN之前进初始化函数必须注解掉
                                                                                                                         
                IMPORT  __main                                                                 ;通知编译器要main在其他的源文件中定义,但要在当前源文件中引用
                LDR     R0, =0x50000100                                                 ;送立即数到R0                 这个是寄存器写保护寄存器 (复位为锁定bit0为0)
                LDR     R1, [R0, #0x10]                                                 ;将0x50000110(rc校验寄存器)处的值送到R1
                CMP     R1, #0x3F                                                         ;比较0x50000110处的值与0x3f  (默认的中心频率应该是0x20)
                BNE     %F0                                                                         ; 如果不相等向前搜索标号为0的行,(以此实现循环,具体可看局部标号的知识)
                                                                                                                         ;如果相等就解锁 寄存器写保护寄存器         并         将        rc校验寄存器  设为中心值0x20
                LDR     R1, =0x59
                STR     R1, [R0]
                LDR     R1, =0x16
                STR     R1, [R0]
                LDR     R1, =0x88
                STR     R1, [R0]                                                   ;        向0x50000100写入0x59  0x16  0x88 解锁寄存器写保护寄存器(bit0为1)

                LDR     R1, =0x20                                                   ;加载0x20到R1
                STR     R1, [R0, #0x10]                                           ;将R1(0x20默认中心频率)送到0x50000110(rc校验寄存器)
                MOVS    R1, #0                                                           ;将0送到R1
                STR     R1, [R0]                                        ;将0写入0x50000100重锁保护寄存器
0                                                                                                                    ;标号

                                ;LDR     R0, =SystemInit
                ;BLX     R0                         ;这就是前面说的进初始化函数,如果你主程序里没有,必须注解掉。



                LDR     R0, =__main                                        ; 使用“=”表示LDR目前是伪指令不是标准指令。这里是把__main的地址给RO。

                BX      R0                                                        ;        BX是ARM指令集和THUMB指令集之间程序的跳转
                                                                                                        ;  也就是跳到MAIN处
                ENDP                                                           ; 复位子程序结束
               
               
; Dummy Exception Handlers (infinite loops which can be modified)               
               
NMI_Handler     PROC                                                           ;  函数的开始
                EXPORT  NMI_Handler               [WEAK]   ;        EXPORT  NMI_Handler可外部引用 的标号
                B       .                                                   ; 跳到当前行
                ENDP                                                           ; 函数的结束


HardFault_Handler\
                PROC                                                       
                                                                                ;   "/"是换行的意思
                EXPORT  HardFault_Handler         [WEAK]
                B       .
                ENDP



SVC_Handler     PROC
                EXPORT  SVC_Handler               [WEAK]
                B       .
                ENDP


PendSV_Handler  PROC
                EXPORT  PendSV_Handler            [WEAK]
                B       .
                ENDP



SysTick_Handler PROC
                EXPORT  SysTick_Handler           [WEAK]
                B       .
                ENDP



Default_Handler PROC


                EXPORT  BOD_IRQHandler            [WEAK]
                EXPORT  WDT_IRQHandler            [WEAK]
                EXPORT  EINT0_IRQHandler          [WEAK]
                EXPORT  EINT1_IRQHandler          [WEAK]
                EXPORT  GPIOP0P1_IRQHandler       [WEAK]
                EXPORT  GPIOP2P3P4_IRQHandler     [WEAK]
                EXPORT  PWMA_IRQHandler           [WEAK]
                EXPORT  PWMB_IRQHandler           [WEAK]
                EXPORT  TMR0_IRQHandler           [WEAK]
                EXPORT  TMR1_IRQHandler           [WEAK]
                EXPORT  TMR2_IRQHandler           [WEAK]
                EXPORT  TMR3_IRQHandler           [WEAK]
                EXPORT  UART0_IRQHandler          [WEAK]
                EXPORT  UART1_IRQHandler          [WEAK]
                EXPORT  SPI0_IRQHandler           [WEAK]
                EXPORT  SPI1_IRQHandler           [WEAK]
                EXPORT  I2C_IRQHandler            [WEAK]
                EXPORT  PWRWU_IRQHandler          [WEAK]
                EXPORT  ADC_IRQHandler            [WEAK]
               
BOD_IRQHandler
WDT_IRQHandler
EINT0_IRQHandler
EINT1_IRQHandler
GPIOP0P1_IRQHandler
GPIOP2P3P4_IRQHandler
PWMA_IRQHandler
PWMB_IRQHandler
TMR0_IRQHandler
TMR1_IRQHandler
TMR2_IRQHandler
TMR3_IRQHandler
UART0_IRQHandler
UART1_IRQHandler
SPI0_IRQHandler
SPI1_IRQHandler
I2C_IRQHandler
PWRWU_IRQHandler
ADC_IRQHandler
                B       .
                ENDP


                ALIGN


; User Initial Stack & Heap
;         堆和栈的初始化
                IF      :DEF:__MICROLIB                 ;;“DEF”的用法——:DEF:X 就是说X定义了则为真,否则为假
               
                EXPORT  __initial_sp
                EXPORT  __heap_base
                EXPORT  __heap_limit
               
                ELSE
               
                IMPORT  __use_two_region_memory
                EXPORT  __user_initial_stackheap
__user_initial_stackheap

                LDR     R0, =  Heap_Mem
                LDR     R1, = (Stack_Mem + Stack_Size)
                LDR     R2, = (Heap_Mem +  Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR

                ALIGN

                ENDIF


                END

使用特权

评论回复
32
ouxueguo| | 2012-12-28 16:33 | 只看该作者
:)先学习。。。。。。。。。坐等价格优势。。。。。。。。。。。。。。。。

使用特权

评论回复
33
cnt130126| | 2013-1-14 13:14 | 只看该作者
mark

使用特权

评论回复
34
188598686| | 2013-11-5 20:44 | 只看该作者
太给力了,这个比自己看例程好玩

使用特权

评论回复
35
-|continue;|-| | 2013-11-5 23:39 | 只看该作者
很好,给力,当官方用

使用特权

评论回复
36
callhgd| | 2014-2-12 13:03 | 只看该作者
不错啊。

使用特权

评论回复
37
379751428| | 2014-12-16 18:48 | 只看该作者
很好很好,大力支持

使用特权

评论回复
38
lvyunhua| | 2014-12-17 11:05 | 只看该作者
楼主辛苦了。支持

使用特权

评论回复
39
Ketose| | 2014-12-17 11:27 | 只看该作者
很不错,都是为了减少程序员的工作量啊。
希望能加入更多的芯片支持,最后来个图型化的工具。

使用特权

评论回复
40
Ketose| | 2014-12-23 10:02 | 只看该作者
新唐应该把楼主的劳动成果收购了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则