页次: 1
已经开发完了,307R-DC还有点性价比,307A就算了功耗高价格贵
307A已经不再支持了,AT固件都停留在2023年。
这模组用的芯片是ASR1603/1606,是带蜂窝网络 modem 的 MCU,我这儿有从FAE要来的AT固件
ML307R-DC-MBRH0S01_3.1.0.2409241023_release.zip
希望各位大哥多找他们要要固件
例如ML307模组,使用的就是ASR1603这个MCU-SoC,即使可以开发也是用基于OpenCPU这个软件架构进行二次开发,而不是像STM32或ESP32那样进行开发。
ESP32 has the ability to use up to 4 MB of virtual addresses for external PSRAM (Psuedostatic RAM) memory
Both the upper 128 KB of SRAM0 and the upper 128 KB of SRAM2 are governed by an MMU. Not only can these
MMUs allow or deny access to the memory they govern (just like the MPUs do), but they are also capable of
translating the address a CPU reads from or writes to (which is a virtual address) to a possibly different address
in memory (the physical address).
这MMU貌似是管SRAM映射的。
你是想用 ESP-AT 还是想开发?
请问对个人开发者来说,哪种 SoC 的资料比较全,并且一直在更新?
我看了 Luckfox 和 Milkv 貌似都还行,但是 Luckfox 用的 RV1106 资料貌似还是差一点儿,原厂的 SDK 也没给。
我发现市面上 PC 显示器的驱动芯片信息非常少,datasheet 完全没有,更别提 TRM,那么 Linux 发行版是怎么写驱动的?
贴一个 LCD driver 网站:
https://www.lcdfans.com/category/article
RTOS使用systick溢出中断的分辨率是毫秒,其计数器VAL的分辨率小于微秒。两者结合可以得到微秒分辨率的计时
好的,谢谢大佬指点。
只需要搞到模块的原理图和图像传感器的 TRM 就行,剩下的就是写驱动。
当然,写驱动时,对于图像传感器的配置也是个问题,一般厂商会给一个 application note,里面有写好的配置参数,不然一个一个寄存器配简直噩梦。
采用了 STM32F103C8T6 核心板和 OV2640 图像传感器模块。
效果:
部分时序图:
开发中遇到的坑
1.SCCB 模拟:SCCB 是 I2C-bus 的改版,主要是 OV2640 模块没有上拉电阻,无法采用开漏输出。
2.并行接口的模拟:如果使用 IO 模拟的话,只能达到 1 FPS,但是使用了 Timer 和 DMA,就可以达到 1.5-2 FPS。
项目链接:https://github.com/ShiinaKaze/STM32F1_OV2640
只需要搞到模块的原理图和图像传感器的 TRM 就行,剩下的就是写驱动。
Sensirion 的传感器在很多产品能见到,比如小米的温度计,本人通过软件 I2C 实现了其驱动,当然,只是部分功能,因为该传感器有不同模式,因为懒所以没写。
该驱动通过 macro 来定义 GPIO 操作,方便快速移植。
修改下面四个 marco 即可:
#define SW_I2C_Delay() Delay_us(5)
#define SW_I2C_SCL_WriteBit(BitVal) GPIO_WriteBit(SW_I2C_GPIOx, SW_I2C_SCL_PIN, (BitAction)BitVal)
#define SW_I2C_SDA_WriteBit(BitVal) GPIO_WriteBit(SW_I2C_GPIOx, SW_I2C_SDA_PIN, (BitAction)BitVal)
#define SW_I2C_SDA_ReadBit() GPIO_ReadInputDataBit(SW_I2C_GPIOx, SW_I2C_SDA_PIN)
中央处理单元(central processing unit)是计算机架构中的一个抽象元素,它可以使用不同的集成电路来实现。所以 CPU 在描述计算机系统时用的非常宽泛。
描述系统采用后缀添加 unit 的方式,例如 microcontroller unit 即 MCU
描述单个集成电路(Integrated circuit)则采用微处理器(microprocessor)和微控制器(microcontroller)等名称。按照集成度可查看以下表格:
参考:
[1]: https://en.wikipedia.org/wiki/Microprocessor
[2]: https://www.computerhistory.org/
[3]: https://www.sciencedirect.com/topics/computer-science/microprocessor
[4]: https://www.sciencedirect.com/topics/engineering/microcontroller
最开始 CPU 没用 MOS 技术,直接拿电阻器或真空管搭的,例如 IBM System 704,也就在这时提出了 CPU 这个概念。这个可以在 IBM 704 的手册找到:
704 electronic data-processing machine - manual of operation
由于 MOS 技术的快速发展 Viatron Computer Systems 公司在 1968 年把用于处理数据的 IC 称为微处理器(microprocessor),而第一个使用 MOS/LSI 技术的 CPU 在 F-14 战斗机的 CADC 中的 MP944 chipset 中,于 1970 年诞生,但是由于保密,鲜为人知。Intel 在 1971 年推出了第一个商用微处理器 Intel 4004
至此微处理器被定义:把 CPU 集成到一块集成电路(芯片)上,称为微处理器。
1974 年德州仪器(Texas Instruments)推出了 TMS 1000NC,从它的 datasheet 可以看到被称为 “one-chip microcomputer”,它将 CPU,RAM,ROM,I/O 设备集成到了 IC 上
日本在 1970-1980 大力发展半导体,4-bit 和 8-bit microcomputer 层出不穷,根据当时的产品 datasheet,可以看到 "single-chip microcomputer",加上日本电子商品大量流入国内,这可能是单芯片微型计算机,即单片机一词的来源。
再后来,就是 Intel 8048 (MCS-48 family) 的兴起和 Intel 8051 (MCS-51 family),Intel 8048 的 datasheet 已经正式给这种设备命名,即微控制器(Microcontroller)。
第一个 SoC (system-on-chip) 为 Intel 5810,于 1974 年被应用于 Microma 手表上,它除了集成计算机基本组件,还集成了 LCD 驱动器和定时器。
随着 MOS 技术的继续发展,更多组件集成到了 IC 上,包括 GPU,ISP,DSP 等,而且不同厂商对于 SoC 的称呼都有不同,例如 Qualcomm 称自己的 SoC 为 platform,Arm 和 NXP 则称为 application processor
@shiinakaze
补充和强调:
Qualcomm 对自己的 SoC 有不同的称呼即 platform。
shiinakaze 说:@海石生风
如果你连基本概念都分不清,确实对你来说是废话。platform和SoC你倒是分清概念呀,无非嘴硬。懒得鸟了,浪费时间。
文章不是写了?你自己分不清说我嘴硬就有点搞笑了。链接:Wikipedia - Qualcomm Snapdragon
Snapdragon is a suite of system-on-chip (SoC) semiconductor products for mobile devices designed and marketed by Qualcomm Technologies Inc. The Snapdragon's central processing unit (CPU) uses the ARM architecture. As such, Qualcomm often refers to the Snapdragon as a "mobile platform". Snapdragon semiconductors are embedded in devices of various systems, including vehicles, Android, Windows Phone and netbooks.[1] In addition to the processors, the Snapdragon line includes modems, Wi-Fi chips and mobile charging products.
@海石生风
如果你连基本概念都分不清,确实对你来说是废话。
我在裸机上使用的 Delay 是用 systick timer 实现的
/**
* @brief Microsecond delay
* @param us specifies the delay time length, in microseconds.
* @retval None
*/
void Delay_us(uint32_t us)
{
if (us > 0)
{
SysTick->LOAD = SYSTICK_LOAD * us; // Set systick reload value
SysTick->VAL = 0x00; // Set SysTick Current Value to 0
SysTick->CTRL = 0x00000005; // Set SysTick clock source to use processor clock and enable timer
while (!(SysTick->CTRL & 0x00010000)) // Wait for the timer to count to 0
{
}
// SysTick->CTRL = 0x00000004; // Disable timer
}
}
所以会和 FreeRTOS 产生冲突,所以采用了 TIM2:
void Delay_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseInitStructure.TIM_Period = 1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
}
/**
* @brief Microsecond delay
* @param us specifies the delay time length, in microseconds.
* @retval None
*/
void Delay_us(uint32_t us)
{
if (us > 0)
{
TIM2->CNT = us - 1; // 向计数器装要递减的数,减到0后会触发定时器的TIM_FLAG_UpDate标志位
TIM2->CR1 |= TIM_CR1_CEN; // 使能计数器, 计数器开始递减
while ((TIM2->SR & TIM_FLAG_Update) != SET)
{
// 等到计数器减到0
}
TIM2->CR1 &= (~TIM_CR1_CEN); // 关闭计数器
TIM2->SR &= (~TIM_FLAG_Update); // 清除定时器变为0的标志位
}
}
请问还有其他方法么?比如还是利用 SysTick 来delay,只读不修改。
创建任务时,usStackDepth 最好设置大一点儿,例如 128
如果你使用任何通信,请把通信函数添加到 `portENTER_CRITICAL()` 和 `portEXIT_CRITICAL()` 之间,这是为了确保时间片结束不会被打断通信
void vSHT30Task(void *pvParameters)
{
SHT30_TypeDef sht30 = {0};
for (;;)
{
portENTER_CRITICAL();
SHT30_Measure_Periodic_Mode(&sht30);
OLED_ShowNum(3, 1, sht30.temp, 4);
OLED_ShowNum(4, 1, sht30.hum, 4);
printf("sht30_task:%f\n", sht30.hum);
portEXIT_CRITICAL();
vTaskDelay(1000);
}
}
p.s. 为什么论坛不支持 markdown 呢,写文章好麻烦。
@海石生风
这不就是我文章里面已经提到的东西么,还有严格来说 CPU 只是一个计算机架构中的一个抽象模型,并不是一个实际物体,文章的所有内容来自论文和 wikipedia 的说明,并非我自顾自的意想。
@海石生风
不乱吧,只是根据学术界和工业界的术语解释来的。
根据 arm 的教育书籍 Fundamentals of System-on-Chip Design on Arm Cortex-M Microcontrollers
在术语方面,值得重申的是,CPU 是用于通用应用程序的单个处理器核心。它不能自己操作,因为它需要输入、输出和外设,而且必须有与它相关联的存储器才能运行。在微控制器单元(MCU)和 SoC 的定义之间产生混淆。一般来说,MCU 由 CPU、Memory(RAM、ROM)、外设组成,用于基本控制应用。SoC 则被认为更复杂,因为它可以包括 GPU、DSP、图像处理器等元素,并且从 Memory 和外设的角度来看,SoC 要大得多。
嵌入式系统(embedded system)中常用 microcontroller,所以 microcontroller 在嵌入式系统中称为 MCU (microcontroller unit)。
MCU 开发一般指应用开发(application development),比如操作 MCU 外设(GPIO,I2C,SPI 等)。
一般 MCU 开发资源包括 3 个方面:Development Software, Development Tool, Development Document
Development Software
Development Software 一般包含 Software Interface 和 Driver Library,Software Interface 定义了各个 Register,Driver Library 则在 Software Interface 基础上,封装了 MCU peripheral 的基本 Function。
以 STM32 为例:
Software Interface (CMSIS)
Driver Library (STM32 standard peripheral library)
Development Tool
一般是配合开发的工具软件,例如 IDE,Development Toolchain (compiler, stdlib),Development Kit,只需了解如何使用即可,参考用户手册。
Development Document
供开发者查询的文档,比如 Datasheet,User Manual,Reference Manual(or Product Specification),Application Note 等。
在开发一款 MCU 时,需要按照以下步骤进行:
1.首先,查阅 MCU 的 Datasheet 或 Product Specification,它提供了MCU的概览和架构图,这是理解MCU结构的基础。Datasheet 还会详细说明 memory map,general register、peripheral register、ROM、RAM 的地址分配情况。
2.接着,粗略查看 Reference Manual,这个文档详细描述了各个 peripheral register 的功能和地址,并且说明了 peripheral register 如何控制 peripheral 工作。
3.最后,阅读 User Manual,这些手册通常包含有关 Driver library 的文档,介绍 Driver library 的使用方法、各个函数的信息,以及如何调用这些函数。User Manual 可能包含示例代码,帮助你理解如何实际应用这些函数。
由你编写的 Application Code 将和 MCU Library、Software Interface 一起,被工具链编译成可执行文件(一般格式为 ELF),然后通过 Debugger 下载到 MCU 中。
查了一下资料发现是 IBM System 704 提出了 CPU 这个概念。
最开始 CPU 没用 MOS 技术,直接拿电阻器或真空管搭的,例如 IBM System/360,当然,CPU 也是 IBM 提出的。
然后第一个使用 MOS/LSI 技术的 CPU,即把 CPU 集成到一块集成电路(芯片)上,称为微处理器(microprocessor),在系统里称为 MPU (microprocessor unit),毕竟系统由单元构成嘛。
随着集成度的提高,TI 的工程师又把外设、RAM、ROM 也集成了进去,称为微控制器(microcontroller),在嵌入式系统里称为 MCU。
再随着集成化提高,媒体(音频和视频)模块,GPU 也被集成了进去,这称为片上系统(system-on-chip, SoC),这个在系统里叫什么没有定,但是面向消费者一般称为 CPU。
所以你可以在这里发现,如果相对于整个系统来说,一般是称 XXU,而单独描述这个设备,则称为 microprocessor,microcontroller,SoC,processor,platform。
不同厂商称自己的 IC 都有不同:
Intel: processor
Qualcomm: platform
海思和全志: SoC
比如 PC 的 CPU 一般为 Intel processor,移动电话机的 CPU 一般为 snapdragon platform 或 Kirin SoC。
至于为什么市面上只使用了 CPU,那是因为为了方便顾客购买,顾客不需要了解这么多知识,直接命名 CPU 省事儿。
但从专业角度来讲,看你是在描述整个系统,还是在描述单个集成电路
System : CPU,MPU,MCU
Integrated circuit: microprocessor,microcontroller,SoC,processor,platform
页次: 1