楼主: 噬猎者

[分享] 【LPC54102寄存器开发指南】

[复制链接]
  • TA的每日心情
    开心
    2017-1-13 13:54
  • 签到天数: 32 天

    连续签到: 1 天

    [LV.5]常住居民I

    5

    主题

    236

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    423
    最后登录
    2017-10-31
    发表于 2016-11-20 20:59:25 | 显示全部楼层
    膜拜大神
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-12 15:48
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    425

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1084
    最后登录
    2018-2-12
    发表于 2016-11-21 08:30:35 | 显示全部楼层
    虽然还看不懂,但是要支持一下你这大神
    不知道大家放假了吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-10-11 11:01
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    0

    主题

    16

    帖子

    0

    注册会员

    Rank: 2

    积分
    62
    最后登录
    2019-4-3
    发表于 2016-11-21 08:42:02 | 显示全部楼层
    楼主,你太强大了!谢谢你的资料!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-10-11 11:01
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    0

    主题

    16

    帖子

    0

    注册会员

    Rank: 2

    积分
    62
    最后登录
    2019-4-3
    发表于 2016-11-21 08:42:55 | 显示全部楼层
    不过现在开发32位处理器还是用库更好些!回头给我们弄一个库开发指南吧!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-12-8 10:21
  • 签到天数: 743 天

    连续签到: 1 天

    [LV.9]以坛为家II

    0

    主题

    1650

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    19069
    最后登录
    2021-5-6
    发表于 2016-11-21 09:16:16 | 显示全部楼层
    不错不错,楼主厉害,支持楼主
    我又来签到了.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-22 20:15
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    23

    主题

    341

    帖子

    1

    高级会员

    Rank: 4

    积分
    909
    最后登录
    2019-4-7
     楼主| 发表于 2016-11-21 09:51:08 | 显示全部楼层
    ccfengfw 发表于 2016-11-21 08:42
    不过现在开发32位处理器还是用库更好些!回头给我们弄一个库开发指南吧! ...

    谢谢支持。其实如果用库的话,官方提供的库应该更好些,虽然工程比较大,但是他们都封装好了驱动,我们可以直接使用,但是用库的不好处就是很多真正的参数我们都看不到,还有就是库比较庞大,不过可以尝试开发库函数的使用教程。
    成功的小小喜悦里,大脑自身可以产生兴奋剂哦!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-22 20:15
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    23

    主题

    341

    帖子

    1

    高级会员

    Rank: 4

    积分
    909
    最后登录
    2019-4-7
     楼主| 发表于 2016-11-21 09:51:32 | 显示全部楼层
    zbber 发表于 2016-11-21 09:16
    不错不错,楼主厉害,支持楼主

    谢谢支持
    成功的小小喜悦里,大脑自身可以产生兴奋剂哦!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2016-12-31 20:54
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    3

    主题

    66

    帖子

    0

    注册会员

    Rank: 2

    积分
    198
    最后登录
    2017-8-8
    发表于 2016-11-25 23:06:49 | 显示全部楼层
    非常有用,感谢分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-13 09:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    2

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    43
    最后登录
    2022-5-19
    发表于 2017-3-2 10:19:06 | 显示全部楼层
    分享文件失效了啊,可以再更新一下链接吗 谢谢啦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-22 20:15
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    23

    主题

    341

    帖子

    1

    高级会员

    Rank: 4

    积分
    909
    最后登录
    2019-4-7
     楼主| 发表于 2017-3-21 11:48:32 | 显示全部楼层
    本帖最后由 噬猎者 于 2017-3-21 11:58 编辑

    我要分享-LPC541XX系列单片机寄存器快速配置历程
    前些日子实在太忙了,现在把已投入使用的LPC54102单片机的通用型寄存器的快速配置分享给大家:

    可能这次的会包含原帖的一些东西,具体涉及到具体的寄存器就不给大家讲解了,教会大家如何快速配置和使用吧!

    1.LED灯测试(GPIO输出功能测试)-IOCON寄存器,GPIO寄存器
    1. void All_Init(void)//全部初始化
    2. {
    3.         SysClock_Init();//时钟初始化
    4.         LED_Init();//LED初始化
    5.         Chip_Clock_DisablePeriphClock(SYSCON_CLOCK_IOCON);// 禁能IOCON时钟,不关也可以,关了省电,还可以提高程序稳定性
    6. }

    7. void SysClock_Init(void)//时钟初始化
    8. {
    9.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_INPUTMUX);
    10.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_IOCON);
    11.         
    12.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_GPIO0);
    13.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_GPIO1);
    14. }

    15. void LED_Init(void)//LED初始化
    16. {
    17.         //LED_R P1-13
    18.         //LED_G P1-12
    19.         //LED_B P0-15
    20.         PORT1_IOCON13 = 0x00000180;
    21.         PORT1_GPIO_DIR |= 1UL << 13;
    22.         LED_RED_OFF;
    23.         
    24.         PORT1_IOCON12 = 0x00000180;
    25.         PORT1_GPIO_DIR |= 1UL << 12;
    26.         LED_GREEN_OFF;
    27.         
    28.         PORT0_IOCON15 = 0x00000180;
    29.         PORT0_GPIO_DIR |= 1UL << 15;
    30.         LED_BLUE_OFF;
    31. }
    复制代码
    GPIO寄存器的管脚电平设置可参考LED的宏定义:
    1. //LED
    2. #define LED_R PORT1_OUT(13)
    3. #define LED_G PORT1_OUT(12)
    4. #define LED_B PORT0_OUT(15)
    5.         
    6.         
    7. #define LED_RED_OFF        PORT1_GPIO_SET |= 1<<13
    8. #define LED_GREEN_OFF        PORT1_GPIO_SET |= 1<<12
    9. #define LED_BLUE_OFF        PORT0_GPIO_SET |= 1<<15

    10. #define LED_RED_ON                PORT1_GPIO_CLR |= 1<<13
    11. #define LED_GREEN_ON        PORT1_GPIO_CLR |= 1<<12
    12. #define LED_BLUE_ON         PORT0_GPIO_CLR |= 1<<15

    13. #define LED_RED_TURN        PORT1_GPIO_NOT |= 1<<13
    14. #define LED_GREEN_TURN        PORT1_GPIO_NOT |= 1<<12
    15. #define LED_BLUE_TURN         PORT0_GPIO_NOT |= 1<<15
    复制代码
    2.UART测试(UART 发送/接收/中断 功能测试)-USART0-3寄存器
    1. void All_Init(void)//全部初始化
    2. {
    3.         SysClock_Init();//时钟初始化
    4.         Uart_Init();//串口初始化
    5.         Chip_Clock_DisablePeriphClock(SYSCON_CLOCK_IOCON);// 禁能IOCON时钟,不关也可以,关了省电,还可以提高程序稳定性
    6. }

    7. void SysClock_Init(void)//时钟初始化
    8. {
    9.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_INPUTMUX);
    10.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_IOCON);
    11.         
    12.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_GPIO0);
    13.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_GPIO1);
    14.         
    15.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_USART1);//使能UASRT时钟
    16.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_FRG);
    17. }

    18. void Uart_Init(void)//串口初始化
    19. {
    20. //UART_TXD P0-5 U1
    21. //UART_RXD P0-6 U1
    22. //使能管脚:
    23.         PORT0_IOCON5 = 0x00000181;
    24.         PORT0_IOCON6 = 0x00000181;

    25.         UART1_CFG=0;//首先禁止通信
    26.         UART1_CTL=0;//清除所有设置
    27.         UART1_CFG |= 0x04UL;//设置8位数据,1位停止,无奇偶校验
    28.         LPC_ASYNC_SYSCON->FRGCTRL = ((uint32_t) 0x7d << 8) | 0xFF;
    29.         //波特率
    30.         UART1_OSR = 0xd;
    31.         UART1_BRG = 4;
    32.         UART1_CFG |= 0x01u;// 配置完成允许通信
    33. //启动串口接收中断
    34.         UART1_INTENSET = 0x01;
    35.         UART1_CFG |= 0x0100u;//配置串口接收中断
    36.         NVIC_ClearPendingIRQ(UART1_IRQn);//清除任何挂起的串口中断
    37.         NVIC_EnableIRQ(UART1_IRQn);//使能串口接收中断
    38.         NVIC_SetPriority(UART1_IRQn,1);//设置串口接收中断优先级
    39. }
    复制代码
    发送和接收请参考如下程序,由于printf属于FIRL中函数,就不给大家编写了,需要的可以询问我
    1. uint8 UART_getchar(void)//串口接收一个字符
    2. {
    3.         while(!(UART1_STAT & 0x01)){}//等待接收机就绪
    4.                 return UART1_RXDAT;
    5. }
    6. void UART_putchar(uint8 num)//串口打印一个字符
    7. {
    8.         while(!(UART1_STAT&0x04)){}// 等待发射机就绪
    9.                 UART1_TXDAT = num;
    10. }
    11. void UART_putbuff(uint8 *buff, uint32 len)//输出字符串数据
    12. {
    13.     while(len--)
    14.     {
    15.         UART_putchar(*buff);
    16.         buff++;
    17.     }
    18. }
    复制代码
    3.按键测试(GPIO输入功能测试)-IOCON寄存器,GPIO寄存器
    1. void KEY_Init(void)//按键初始化        
    2. {
    3.         //KEY1-KEY6 P0-29 (注意23-28无内部上拉功能)
    4.         //总线配置:输入上拉模式
    5.         PORT0_IOCON9 = 0x00000190;
    6.         PORT0_IOCON10 = 0x00000190;
    7.         PORT0_IOCON11 = 0x00000190;
    8.         PORT0_IOCON12 = 0x00000190;
    9.         PORT0_IOCON13 = 0x00000190;
    10.         PORT0_IOCON14 = 0x00000190;
    11.         PORT0_GPIO_DIR &= ~(0x00007e00);//配置为输入模式
    12. }
    复制代码
    1. #define Read_DIP_SW1 PORT0_IN(3)//拨码开关1
    2. #define Read_DIP_SW2 PORT0_IN(2)//拨码开关2        
    3. #define Read_DIP_SW3 PORT0_IN(7)//拨码开关3
    复制代码
    这个是以总线形式读取键值,需要并口读入的可以这样用
    1. #define READ_KEY_DATA ((PORT0_GPIO_PIN>>9)&0x3f)//获取键值(总线形式获取键值)
    复制代码
    4.PWM测试(SCT专用PWM输出功能测试)-SCT寄存器
    1. void All_Init(void)//全部初始化
    2. {
    3.         SysClock_Init();//时钟初始化
    4.         PWM_Init();//PWM初始化
    5.         Chip_Clock_DisablePeriphClock(SYSCON_CLOCK_IOCON);// 禁能IOCON时钟,不关也可以,关了省电,还可以提高程序稳定性
    6. }

    7. void SysClock_Init(void)//时钟初始化
    8. {
    9.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_INPUTMUX);
    10.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_IOCON);
    11.         
    12.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_GPIO0);
    13.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_GPIO1);
    14.         
    15.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_SCT0);
    16.         Chip_SYSCON_PeriphReset(RESET_SCT0);
    17. }
    复制代码
    1. #define SETSCT_PWM 10000//10KHZ        100 000 000/计数频率 = SETSCT_PWM        这里包含着计数值 100 000 000 /10000 = 10000
    2. void PWM_Init(void)//PWM初始化
    3. {        
    4. //Stop SCT
    5.         SCT_CTRL_U = 0x00040004;//HALT_H HALT_L位 1 停止SCT
    6. //清除计数器
    7.         SCT_CTRL_U |= 0x00080008;//CLRCTR_L CLRCTR_H
    8.         SCT_REGMODE_L = 0;
    9.         SCT_REGMODE_H = 0;
    10.         SCT_MATCH0_U = 0;
    11.         SCT_MATCHREL0_U = SETSCT_PWM;
    12.         SCT_EVENT0_CTRL = 1 << 12;
    13.         SCT_EVENT0_STATE = 1;
    14.         /* Set SCT Counter to count 32-bits and reset to 0 after reaching MATCH0 */        
    15.         SCT_CONFIG = 0x00020001;//SCT_CONFIG_AUTOLIMIT_L  SCT_CONFIG_32BIT_COUNTER
    16. //修改这里:        
    17. //        PWM:1.P1.3-sctout6 2.P1.4-sctout7    3.P1.2-sctout5  4.P1.1-sctout4
    18.         PORT1_IOCON3 = 0x00000183;
    19.         PORT1_IOCON4 = 0x00000183;
    20.         PORT1_IOCON2 = 0x00000183;
    21.         PORT1_IOCON1 = 0x00000183;
    22.                
    23.         SCTPWM_SetOutPin(1, 6);//定义PWM识别码(随意设置,不超过8个)
    24.         SCTPWM_SetOutPin(2, 7);
    25.         SCTPWM_SetOutPin(3, 5);
    26.         SCTPWM_SetOutPin(4, 4);

    27.         SCTPWM_SetDutyCycle(1,10000);//设置占空比
    28.         SCTPWM_SetDutyCycle(2,10000);
    29.         SCTPWM_SetDutyCycle(3,10000);
    30.         SCTPWM_SetDutyCycle(4,10000);

    31. //启动SCT
    32.         SCT_CTRL_U &= ~(0x00040004);//SCT_CTRL_HALT_L,SCT_CTRL_HALT_H
    33. }

    34. void SCTPWM_SetOutPin( uint8_t index, uint8_t pin)
    35. {
    36.         ((SCT0_BASE_PTR)->EVENT[index].CTRL) = index | (1 << 12);
    37.         ((SCT0_BASE_PTR)->EVENT[index].STATE) = 1;
    38.         ((SCT0_BASE_PTR)->OUT[pin].SET) = 1;
    39.         ((SCT0_BASE_PTR)->OUT[pin].CLR) = 1 <<index;
    40.         SCT_RES = (SCT_RES & ~(3 << (pin << 1))) | (0x01 << (pin << 1));
    41.         SCT_OUTPUTDIRCTRL = (SCT_OUTPUTDIRCTRL & ~(3 << (pin << 1)));
    42. }

    43. void SCTPWM_SetDutyCycle( uint8_t index, uint32_t ticks)
    44. {
    45.         
    46. #if 1 //占空比0% - 输出0 占空比100% - 输出1        
    47.         ((SCT0_BASE_PTR)->MATCHREL[index].U) = ticks;
    48. #else //占空比0% - 输出1 占空比100% - 输出0        
    49.         if(ticks > SETSCT_PWM) ticks = SETSCT_PWM;
    50.         ((SCT0_BASE_PTR)->MATCHREL[index].U) = SETSCT_PWM-ticks;
    51. #endif
    52. }
    复制代码
    5.定时器 中断测试(TIME通用型定时器功能测试)-CT32B0/1/2/3/4寄存器
    1. void All_Init(void)//全部初始化
    2. {
    3.         SysClock_Init();//时钟初始化
    4.         Time_Init();//定时器初始化
    5.         Chip_Clock_DisablePeriphClock(SYSCON_CLOCK_IOCON);// 禁能IOCON时钟,不关也可以,关了省电,还可以提高程序稳定性
    6. }

    7. void SysClock_Init(void)//时钟初始化
    8. {
    9.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_INPUTMUX);
    10.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_IOCON);
    11.         
    12.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_GPIO0);
    13.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_GPIO1);
    14.         
    15.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_TIMER0);
    16.         Chip_SYSCON_PeriphReset(RESET_TIMER0);
    17. }

    18. #define TIME_SET_MATCH 1//用来选择定时器的控制终端
    19. #define TIME_SET_RATE 12000//RATE = BOARD_EXTCLKINRATE/TICKRATE_HZ    (12 000 000 HZ)/(1000HZ)
    20. void Time_Init(void)//定时器初始化
    21. {
    22.         uint32_t reg;
    23.         TIMER0_PR=0;//在PCLK时钟定时器设定预定值0
    24.         //定时器复位控制
    25.         reg = TIMER0_TCR;//禁用定时器,设置终端数为非0
    26.         TIMER0_TCR = 0;
    27.         TIMER0_TC = 1;
    28.         TIMER0_TCR = 0x02;//软复位定时器计数器
    29.         while (TIMER0_TC != 0) {}//等待终端计数清除
    30.         TIMER0_TCR = reg;//恢复定时器状态        
    31.         //使定时器在时间匹配时产生中断,这里我们配置MR0
    32.         TIMER0_MCR |= 1<<(TIME_SET_MATCH)*3;
    33.         TIMER0_MR(TIME_SET_MATCH) = TIME_SET_RATE;//设置定时器时间
    34.         //设置定时器在匹配发生时重新启动        
    35.         TIMER0_MCR |= 1<<((TIME_SET_MATCH) * 3 + 1);
    36.         //启动定时器
    37.         TIMER0_TCR |=  0x01;//Counter enable
    38.         //清除任何挂起的中断的计时器
    39.         NVIC_ClearPendingIRQ(CT32B0_IRQn);
    40.         //使能定时器中断
    41.         NVIC_EnableIRQ(CT32B0_IRQn);
    42.         //配置定时器中断优先级
    43.         NVIC_SetPriority(CT32B0_IRQn,2);
    44. /*
    45.         定时器中断配置:注意修改该项目数据
    46.         if((TIMER0_IR & (1<<TIME_SET_MATCH))!=0)//中断信号检测
    47.         {        TIMER0_IR |= (1<<TIME_SET_MATCH);//清除中断信号
    48.                
    49.         }
    50. */               
    51. }
    复制代码
    1. <font size="2">//定时器中断处理函数
    2. void CT32B0_IRQHandler(void)
    3. {
    4.         if((TIMER0_IR & (1<<TIME_SET_MATCH))!=0)//中断信号检测
    5.         {        TIMER0_IR |= (1<<TIME_SET_MATCH);//清除中断信号
    6.                
    7.         }
    8. }        </font>
    复制代码


    6.定时器 输入捕获测试(速度脉冲计数器(不启用触发中断)
    )-CT32B0/1/2/3/4寄存器
    (以下均需要开启对应时钟源)
    1. void Speed_InputCapture_Init(void)//速度脉冲计数初始化
    2. {//设置计数器为外部边沿触发计数器
    3. //        P1-6  CT32B1_CAP2
    4. //        P0-20 CT32B3_CAP0         
    5.         PORT1_IOCON6 &= ~0x07;//配置为输入捕获功能
    6.         PORT1_IOCON6 |= 0x03;
    7.         
    8.         PORT0_IOCON20 &= ~0x07;//配置为输入捕获功能
    9.         PORT0_IOCON20 |= 0x03;
    10. //1.定时器复位        
    11.         TIMER1_TCR = 0x02;//软复位定时器计数器
    12. //2.定时器设置
    13.         TIMER1_CTCR = 0x02|((2)<<2);// Count Control Register 计数控制计数器        
    14. //3.启动定时器
    15.         TIMER1_TCR =  0x01;//Counter enable
    16.         
    17. //1.定时器复位        
    18.         TIMER3_TCR = 0x02;//软复位定时器计数器
    19. //2.定时器设置
    20.         TIMER3_CTCR = 0x02|((0)<<2);// Count Control Register 计数控制计数器        
    21. //3.启动定时器
    22.         TIMER3_TCR =  0x01;//Counter enable        
    23.         
    24. //        TIMER1_TC ,TIMER3_TC反馈的是测速值
    25. }
    复制代码

    7.定时器 PWM输出测试-CT32B0/1/2/3/4寄存器
    (以下均需要开启对应时钟源)

    1. #define ENGINE_PWM_Duty                 1000 //周期计数大小
    2. #define ENGINE_PWM_Frequency         100 //PWM输出频率 Hz
    3. void Engine_PWM_Init(void)//舵机PWM输出控制初始化
    4. {
    5. //        P0.14 CT32B2_MAT1
    6.         //匹配时输出1 低于匹配值时输出0
    7.         PORT0_IOCON14 &= ~0x07;
    8.         PORT0_IOCON14 |= 0x03;  //CT32B2_MAT1     
    9.         
    10.         TIMER2_TCR = 0x02;//复位定时器
    11.         
    12.         TIMER2_PC = 0x00;        
    13.         TIMER2_PR = (uint16)(100000000/(ENGINE_PWM_Duty*ENGINE_PWM_Frequency))-1;//分频因子
    14.         TIMER2_PWMC = 0X01<<(1);//设置 MATn 为PWM输出引脚
    15.         
    16.         TIMER2_MCR = 0x02<<0;//设置MR0匹配时复位TC,也就是把MR0当做周期寄存器
    17.         TIMER2_MR(0) = ENGINE_PWM_Duty-1;//设置周期
    18.         TIMER2_MR(1) = 90;//设置占空比MATn
    19.         TIMER2_TCR = 0X01;//启动定时器
    20. //TIMER2_MR(1)修改舵机PWM,注意不要超过总的周期呀!尽量写个限幅
    21. }
    复制代码
    8.SysTick 计时器测试(CORE库)-SysTick寄存器(为了检查程序相应速度)
    1. void Timer_Start(void)//启动计时器
    2. {
    3.         SysTick->CTRL = 0x1<<2;        //SYSTICK使用内部时钟源
    4.         SysTick->VAL = 0;//清空VAL值
    5.         SysTick->LOAD = 10000000;//计数最大值
    6.         SysTick->CTRL |= 0x1;//启动计时器
    7. }
    8. uint16 Get_Timer(void)//关闭计时器并获取计时器数据 ---uS
    9. {
    10.         static uint16 Timer_Result;
    11.         Timer_Result = SysTick->VAL;
    12.         SysTick->CTRL &= ~(0x1);//关闭计时器
    13.         Timer_Result = (10000000 - Timer_Result)/34;        
    14.         return         Timer_Result;
    15. }
    复制代码
    9.ADC测试-ADC0寄存器
    1. #define ADC_RESOL_BIT        12        //12位ADC转换
    2. void ADC_Init(void)//ADC初始化
    3. {
    4.         uint32 i=0;
    5.         uint32_t ctrl;
    6.         uint32_t tmp;
    7. //1.配置管脚功能(ADC管脚采用 模拟 )
    8.         PORT0_IOCON29 = 0x01;//adc0
    9. //        PORT1_IOCON1 = 0x01;//adc4
    10. //        PORT1_IOCON2 = 0x01;//adc5
    11. //        PORT1_IOCON3 = 0x01;//adc6
    12.         
    13.         
    14. //2.ADC配置
    15.         Chip_SYSCON_PowerUp(SYSCON_PDRUNCFG_PD_ADC0 | SYSCON_PDRUNCFG_PD_VDDA_ENA | SYSCON_PDRUNCFG_PD_VREFP);//启动ADC模块供电电源
    16.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_ADC0);//开启ADC0时钟
    17.         Chip_SYSCON_PeriphReset(RESET_ADC0);//复位ADC0
    18.         SYSCON_BASE_PTR->ADCCLKSEL = (uint32_t) 0x00;
    19.         SYSCON_BASE_PTR->ADCCLKDIV = 0x1;        
    20.         ADC_SEQA_CTRL = 0x00;
    21.         ADC_SEQB_CTRL = 0x00;
    22.         //配置ADC管脚:需要修改这个!!!
    23.         ADC_SEQA_CTRL = (0x1<<0)|0xa0000000;        // 信道11:0 |0xa0000000  启动信道0
    24.         
    25. //ADC分辨率设置://3-12 2-10 1-8 0-6
    26. #if ADC_RESOL_BIT == 12
    27.         ADC_CTRL = ((0x3)<<9)|0xFF;
    28. #elif ADC_RESOL_BIT == 10
    29.         ADC_CTRL = ((0x2)<<9)|0xFF;
    30. #elif ADC_RESOL_BIT == 8
    31.         ADC_CTRL = ((0x1)<<9)|0xFF;
    32. #else
    33.         ADC_CTRL = ((0x0)<<9)|0xFF;
    34. #endif        
    35.         ADC_STARTUP = 0x1;
    36.         for ( i = 0; i < 0x10; i++ ) {}        
    37. //校准
    38.         //1,设置ADC频率为30MHz        
    39.         ctrl = ADC_CTRL & 0x00007fff;
    40.         tmp = ctrl;
    41.         tmp &= ~(1 << 8);               
    42.         ADC_CTRL = tmp | 0x63;
    43.         //2,启动校准        
    44.         ADC_CALIBR = 0x01;
    45.         i = 0xF0000;
    46.         while ( (ADC_CALIBR & 0x01) && --i );
    47.         //3,设置频率为原频率        
    48.         ADC_CTRL = ctrl;
    49. //启动ADC               
    50.         ADC_STARTUP = 0x3;
    51.                
    52. /*读取ADCn数据
    53.                 ADC_SEQA_CTRL|=0x1<<26;
    54.                 while ((ADC_DAT3 & 0x80000000U) ==0);// 等待转换完成
    55.                 ADC_Result = (ADC_DAT3>>4)&0xFFF;
    56. */               
    57. }
    复制代码
    10.FPU测试-FPU的库我已经添加进去了,可以下载源代码查看,并测试运算速度

    源代码: 工程源码.zip (3.43 MB, 下载次数: 18)
    成功的小小喜悦里,大脑自身可以产生兴奋剂哦!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 19:01 , Processed in 0.101882 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表