在使用am335x硬件定时器的时候,需要操作物理地址,如果直接按照裸跑时操作寄存器的话会报错,Unable to handle kernel paging request at virtual address 44e0007c。

原因是linux系统的时候使用的是虚拟地址,如果需要使用物理地址需要映射到虚拟地址才能操作。需要用到 ioremap() 函数进行地址映射。

Disabling lock debugging due to kernel taint
HR Timer module installing
Unable to handle kernel paging request at virtual address 44e0007c
pgd = cf35c000
[44e0007c] *pgd=00000000
Internal error: Oops: 805 [#1]
Modules linked in: hrtimer_drv(O+)
CPU: 0    Tainted: G           O  (3.2.0 #572)
PC is at my_hrtimer_drv_init+0x38/0xec [hrtimer_drv]
LR is at console_unlock+0x170/0x1fc
pc : [<bf002038>]    lr : [<c003d9a0>]    psr: 60000013
sp : cf6bfe70  ip : cf6bfd78  fp : cf6bfe9c
r10: bf002000  r9 : c006ed54  r8 : 0000001c
r7 : cf6be000  r6 : bf000538  r5 : bf0003d0  r4 : bf0002dc
r3 : 44e00000  r2 : bf000368  r1 : 00000002  r0 : 00000000
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 10c5387d  Table: 8f35c019  DAC: 00000015
Process insmod (pid: 1205, stack limit = 0xcf6be2f0)
Stack: (0xcf6bfe70 to 0xcf6c0000)
fe60:                                     bf0003d0 c005f04c fffffffc bf0003d0
fe80: bf0003d0 c0737dc0 cf6be000 0000001c cf6bfef4 cf6bfea0 c00087a4 bf00200c
fea0: c005e72c c0203134 cf6bfedc 00000000 c005f3ac c005e720 00000000 cf6bfec8
fec0: bf0003d0 bf0003d0 cf325700 bf0003d0 bf0003d0 cf325700 00000001 0000001c
fee0: c006ed54 0000029a cf6bffa4 cf6bfef8 c007062c c0008680 bf0003dc c0016464
ff00: 00000000 c006ee7c d090d980 d090e1d0 00000000 bf000418 cf318d40 c05fb728
ff20: 00000000 00000000 00000000 00000000 00000000 00000000 d090d000 00001c6a
ff40: d090dca8 d090db49 d090e9d0 cf659940 000008a8 00000998 00000000 00000000
ff60: 00000020 00000021 00000018 00000015 00000011 00000000 00000002 403c2b08
ff80: 00000000 00021d80 00000080 c000f268 cf6be000 00000000 00000000 cf6bffa8
ffa0: c000f000 c007024c 403c2b08 00000000 400fe000 00001c6a 402d9230 00000002
ffc0: 403c2b08 00000000 00021d80 00000080 00021088 00001c6a 402d9230 00000000
ffe0: 403725a0 be8f4b98 402d1b24 403725b0 80000010 400fe000 00000000 00000000
[<bf002038>] (my_hrtimer_drv_init+0x38/0xec [hrtimer_drv]) from [<c00087a4>] (do_one_initcall+0x130/0x1b0)
[<c00087a4>] (do_one_initcall+0x130/0x1b0) from [<c007062c>] (sys_init_module+0x3ec/0x1c2c)
[<c007062c>] (sys_init_module+0x3ec/0x1c2c) from [<c000f000>] (ret_fast_syscall+0x0/0x30)
Code: e34434e0 e59f40a8 e3a01002 e3a00000 (e583107c)
---[ end trace f80a40936e181261 ]---
Segmentation fault

am335x linux下Timer7配置例子,上半部分为映射到虚拟地址对Timer7进行配置的代码,下半部分注释掉的代码为裸跑时的地址操作,两部分一一对应。具体功能配置我也不太熟,怎么配置看am335x手册吧

oid Timer7_config(void)
{volatile unsigned int *var1 = 0;volatile unsigned int *var2 = 0;volatile unsigned int *var3 = 0;volatile unsigned int *var4 = 0;volatile unsigned int *var5 = 0;var1 = (volatile unsigned int *)ioremap(0x44E00000+0x7C, sizeof(var1));writel(0x00000002, var1);printk("0x44E00000 + 0x7C = %x\n", *var1);var2 = (volatile unsigned int *)ioremap(TIMER7_BASE + 0x10, sizeof(var2));writel(0x00000002, var2);printk("TIMER7_BASE + 0x10 = %x\n", *var2);var3 = (volatile unsigned int *)ioremap(TIMER7_BASE + 0x40, sizeof(var3));writel(0x00000000, var3);printk("TIMER7_BASE + 0x40 = %x\n", *var3);var4 = (volatile unsigned int *)ioremap(TIMER7_BASE + 0x38, sizeof(var4));writel(0x00000003, var4);printk("TIMER7_BASE + 0x38 = %x\n", *var4);var5 = (volatile unsigned int *)ioremap(TIMER7_CLKSEL_BASE + 0x04, sizeof(var5));writel(0x00000001, var5);printk("TIMER7_CLKSEL_BASE + 0x04 = %x\n", *var5);// writel(0x00000002, 0x44E00000 + 0x7C);//CM_PER->M_PER_TIMER7_CLKCTRL,开启定时器// printk("OCP Configuration Register = %x\n", readl(TIMER7_BASE + 0x10));// writel(0x00000002, TIMER7_BASE + 0x10);//DMTIMER7->Timer OCP Configuration Register,定时器自由运行// writel(0x00000000, TIMER7_BASE + 0x40);//DMTIMER7->Timer Load Register, timer counter register start value after overflow// writel(0x00000003, TIMER7_BASE + 0x38);//DMTIMER7->Timer Control Register,Auto-Reload,& Start Timer// //时钟选择,默认为高速晶振// writel(0x00000001, TIMER7_CLKSEL_BASE + 0x04);//CM_DPLL->CLKSEL_TIMER7_CLK,时钟源选择,默认复位即为选贼高速晶振
}//读取Timer7计数值
unsigned int GetTimer7Count(void)
{unsigned int *var1, value;var1 = (unsigned int *)ioremap(TIMER7_BASE+0x3C, sizeof(var1));value = *var1;//重置计数值*var1 = 0;return value;
}

am335x硬件定时器使用相关推荐

  1. AM335x硬件开发使用指南(二)

    Functional Block Diagram 二.系统端资源 1.Enhanced direct memory access(eDMA) EDMA用于:传输到片上存储器和从片上存储器传输和传输到外 ...

  2. ESP8266-SDK的硬件定时器

    ESP8266的硬件定时器的使用也比较简单 1.设置定时器的时钟源和自动重装载 hw_timer_init(FRC1_SOURCE, 1);//设置时钟源 和定时器自动重装载 时钟源有两个 NMI 中 ...

  3. ESP32-C3入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器)

    到了测试第6课,还没有玩过ESP32-C3的基本定时器,虽然FreeRTOS,可以使用软件定时器 但是软件定时器毕竟也有不适用的时候,这个在我FreeRTOS博文中有单独说明. 所以硬件定时器也得熟悉 ...

  4. AM335x硬件开发使用指南(一)

    Functional Block Diagram 基本硬件开发的所有335X的接口资源都在上图中显示出来了. 下面来详细分析下Functional Block Diagram里面的一些资源 一.串口类 ...

  5. 基于硬件定时器的软件定时器

    概括 硬件定时器很精确,软件定时器无论如何都有延迟,主要用在不需要精确定时的地方,而且软件定时比较浪费单片机资源. 梳理 讲到定时器,大家多多少少都会接触到硬件定时器,但是由于有时候资源的限制,又难免 ...

  6. FreeRTOS记录(八、用软件定时器?还是硬件定时器?)

    FreeRTOS软件定时器,相对前面的内容来说,软件定时器还是比较简单的,我们简单测试一下 因为是简单介绍,所以原理和源码的分析不会那么详细,具体可以根据文中API查看源码 使用起来记住创建,启动,回 ...

  7. AM574x硬件定时器

    由于任务需要精准定时,项目中决定开启am574x的硬件定时器.根据am5748的TRM手册可知,am5748提供16个GP timers:TIMER1-TIMER16.其中,TIMER1,TIMER2 ...

  8. 延时函数:普通延时,硬件定时器延时,系统定时器延时

    一.普通延时函数 此种延时是基于让MCU做一些无意义的循环操作来打发时间,优点是简单易懂,缺点是会占用MCU的处理资源且精度较低,主要用于程序简单.无严格时间要求的场景中. //微秒级的延时 void ...

  9. RTT之硬件定时器使用

    硬件定时器 问题 在rt编程手册中的时钟管理与HWTIME设备 不同点 使用步骤: 总结 rt定时器设备框架 基本的处理流程 初始化 控制 总结  看了一下之前做的rtt笔记,还真没有做这部分的内容, ...

最新文章

  1. 结合脑成像技术与人工智能,破除自杀的“诅咒”
  2. 每天一个linux命令(31): /etc/group文件详解
  3. Linux 卸载分区(会格式化分区数据)
  4. 974. Subarray Sums Divisible by K
  5. C++:02---命名空间
  6. 华为机试HJ93:数组分组
  7. WLAN定义和基础架构
  8. 网络_远程开机(ubuntu)
  9. 【数学建模】Lingo软件介绍+常用函数总结+样例
  10. 赛门铁克symantec 卸载需要密码解决方法
  11. Thinkpad R60 驱动下载及安装方法 for windows XP
  12. OpenPose:实时多人2D姿态估计
  13. 四旋翼飞行器14——无人机中的OSD、数传、图传、FPV是什么?
  14. MyScript基础功能
  15. 下一个20年: 从搜索经济到算法经济 (从B站跨年爆红 等想到的)
  16. Exception at 0x7fefd73a49d, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continue
  17. MySQL查学生年龄30到40之间_MYSQL查询练习 1
  18. UART、I2C、USB、SPI、CAN、Jtag、PCI/PCIE协议汇总
  19. 【vue】实现多个路由共享同一个页面
  20. 搭载地平线征程2芯片的长安UNI-V正式亮相;美通社再度成为国际消费类电子产品展官方合作伙伴 | 全球TMT...

热门文章

  1. http_proxy设置
  2. 计算机内存tm,Intel(R) Core(TM) i3-3110M CPU @ 2.40GHz支持多大内存
  3. 计算机存储器的有关术语,关于计算机存储器,不正确的描述是()。
  4. sublime 使用浏览器不反应
  5. 有什么好用的便宜的云服务器?
  6. 路由表是干什么的?底层原理是什么?
  7. 宽带多账号自动拨号工具
  8. Twitter网页版推出通用搜索功能 复制链接
  9. 台式计算机提示电池低,台式机电脑电源供电不足怎么办 台式机电脑电源供电不足解决方法【详解】...
  10. PLC模拟量输入的软件滤波使用方法