CYPRESS S6E1C3 系列 FM0+ 32位单片机串口uart0 问题

/*-----------------------------前奏-----------------------------------*/

mcu型号s6e1c32c(48pin)、s6e1c32b(32pin)

本次调试:uart0【与SWD 管脚复用】
由于在启动文件中 :跳转到SystemInit ()初始化系统时钟,再跳转到main()。如下:

Reset_Handler
    LDR R0, =SystemInit
    BLX R0
    LDR R0, =__iar_program_start
    BX R0

/*-----------------------------实干-----------------------------------*/

1,实际在main中,UartInit(115200);  printf("Let us jump ......\r\n"); 并不能输出。,

2,原来FM0+ 默认没有给我们开启串口和IO管脚的时钟。需要类似stm32系列 增添代码:

  Clk_PeripheralClockEnable(ClkGateGpio);
  Clk_PeripheralClockEnable(ClkGateMfs0);//uart0 时钟

3,再次用J-Link 调试,跑飞了:正常结果。SWD被uart0共用,开启uart0,SWD自然失效。拔掉调试线,换成TTL串口查看信息。还是然并卵!!

被打败了?。。。。。。。。不可能!

4,把uart3 的管脚引出,修改串口初始化代码。 发现有打印信息,谢谢上天。还有希望。

5,问题点可能处在SWD的身上,查看SWD复用配置:SetPinFunc_SWCLK();SetPinFunc_SWDIO();再往里面看[深入~内涵一下]。

  里面有定义:bFM_GPIO_EPFR00_SWDEN = 1; 如果关闭SWD功能,即bFM_GPIO_EPFR00_SWDEN = 0; 再开启uart0,能行吗?

6,试了还真行,就是问题所在了。原来在开启uart0功能时,SWD不能自动断开。需要手动操作。

/*-----------------------------上代码-----------------------------------*/

typedef void (*pFunction)(void);
u32 g_AppAddr = 0x0;

void RemapVTOR();

void ExitIAP(void)
{
u32 JumpAddress;
pFunction Jump_To_Application;
//d_p("Jump_To_Application\n");
JumpAddress = *(vu32*) (g_AppAddr + 4);
Jump_To_Application = (pFunction) JumpAddress;

/* Initialize user application‘s Stack Pointer */
__set_MSP(*(vu32*)g_AppAddr);

Jump_To_Application();
}

#define InitUartIo()     {SetPinFunc_SIN0_0();SetPinFunc_SOT0_0();}

#define SWD_ON() {SetPinFunc_SWCLK();SetPinFunc_SWDIO();}
#define SWD_OFF() {bFM_GPIO_EPFR00_SWDEN = 0;}

int main(void)

{
//Clk_PeripheralClockEnable(ClkGateGpio);
//Clk_PeripheralClockEnable(ClkGateMfs0);//uart0 时钟
Clk_PeripheralClockEnableAll();//也可以开启全部时钟

//SWD_ON(); //下次调试开启并屏蔽 SWD_OFF();从新下载一遍
UartInit(115200);
printf("Let us jump ......\r\n");
//RemapVTOR();
ExitIAP();

printf("Jump faild !\r\n");
return 0;
}

uart0.c

void UartInit(uint32_t baudrate)
{
stc_uart_irq_en_t stcIntEn;
stc_uart_irq_cb_t stcIrqCb;
stc_mfs_uart_config_t stcUartConfig;

if(UartCh == &UART0)//串口0 复用SWD 需手动关闭
{SWD_OFF();}// 可以再在串口配置前加点延时。

PDL_ZERO_STRUCT(stcUartConfig);

/* Initialize UART function I/O */
InitUartIo();

/* Initialize UART RX/TX interrupt */
stcIntEn.bRxIrq = TRUE;
stcIntEn.bTxIrq = FALSE;
stcIrqCb.pfnRxIrqCb = Uart_RX_IRQHandler;
stcIrqCb.pfnTxIrqCb = NULL;
/* Initialize UART RX/TX channel */
stcUartConfig.enMode = UartNormal;
stcUartConfig.u32BautRate = baudrate;
stcUartConfig.enDataLength = UartEightBits;
stcUartConfig.enParity = UartParityNone;
stcUartConfig.enStopBit = UartOneStopBit;
stcUartConfig.enBitDirection = UartDataLsbFirst;
stcUartConfig.bInvertData = FALSE;
stcUartConfig.bHwFlow = FALSE;
stcUartConfig.pstcFifoConfig = NULL;
stcUartConfig.bUseExtClk = FALSE;
stcUartConfig.pstcIrqEn = &stcIntEn;
stcUartConfig.pstcIrqCb = &stcIrqCb;
stcUartConfig.bTouchNvic = TRUE;
Mfs_Uart_Init(UartCh, &stcUartConfig);

/* Enable TX function of UART0 */
Mfs_Uart_EnableFunc(UartCh, UartRx);
Mfs_Uart_EnableFunc(UartCh, UartTx);

return;
}

void UartSendByte(uint8_t dat)
{
while(TRUE != Mfs_Uart_GetStatus(UartCh, UartTxIdle));
while (TRUE != Mfs_Uart_GetStatus(UartCh, UartTxEmpty)); /* wait until TX buffer empty */
Mfs_Uart_SendData(UartCh, dat);

return;
}

int putchar(int ch)
{
if(ch == ‘\n‘)
{
UartSendByte(‘\r‘);
}
UartSendByte((unsigned char)ch);
return ch;
}

/*-----------------------------实际结果-----------------------------------*/

每次实现:printf("Let us jump ......\r\n");

就打印  Let us jump ...... 并跳转到复位状态,地址 0;

最后一直循环跳转,不停打印

 Let us jump ......

Let us jump ......

Let us jump ......

Let us jump ......

时间: 2024-11-03 21:41:17

CYPRESS S6E1C3 系列 FM0+ 32位单片机串口uart0 问题的相关文章

8位16位32位单片机区别

8位16位32位区别 8位单片机的数据总线宽度为8位,通常直接只能处理8位数据: 16位单片机的数据总线宽度为16位,通常可直接处理8位或16位数据. 8位数据类型所占大小 16位数据类型所占大小 stm32,k60数据类型

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_resume.html Linux电源管理(6)_Generic PM之Suspend功能一文中的下图. 本文主要分析平台相关的CPU睡眠和唤醒,即下电和上电流程,以及ARM底层汇编代码实现. 内核版本:3.1.0               CPU:ARM Cortex-A7 1 平台相关函数执行流程

Linux内核系列—操作系统开发之进入32位保护模式

源码如下: ; ========================================== ; pmtest1.asm ; 编译方法:nasm pmtest1.asm -o pmtest1.bin ; ========================================== %include "pm.inc" ; 常量, 宏, 以及一些说明 org 07c00h jmp LABEL_BEGIN [SECTION .gdt] ; GDT ; 段基址, 段界限 , 属

STM32F030系列实现仿位带操作

1.闲言 最近开发的时候,用到了STM32F030F4P6型号的单片机,它只有20个引脚,价格非常便宜,但是功能齐全:定时器.外部中断.串口.IIC.SPI.DMA和WWDG等等,应用尽有,非常适合用来做小设备.可是有个问题是,它是Cortex-M0内核的,不像M3,M4内核一样,可以支持位带操作(就是一位一位地操作,像80C51单片机一样),这就给程序移植或者开发带来了一点点小麻烦,因此我就利用C语言结构的位段操作,实现了个访位带操作,只是在效率可能会稍逊于真正的位带操作,但是代码上可以兼容,

51单片机串口通信

一.原理简介 51 单片机内部有一个全双工串行接口.什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行:既可接收又可发送,但不能同时进行的称为半双工:能同时接收和发送的串行口称为全双工串行口.串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信.其缺点是传输速度较低. 与之前一样,首先我们来了解单片机串口相关的寄存器. SBUF 寄存器:它是两个在物理上独立的接收.发送缓冲器,可同时发送.接收数据,可通过指令对SBUF 的读写

32位平台代码向64位平台移植

1背景描述 从苹果A7处理器开始,就支持着两种不同的指令集:第一种为原有处理器所支持的32-bit ARM指令集,第二种为崭新的64-bit ARM体系结构.这种64-bit体系结构拥有更大的地址空间,最大支持16GB内存,同时它一次性可提取64位数据,比32-bit体系提高了一倍.现如今,苹果的LLVM编译器已经能够充分支持64-bit指令集. 正如苹果A7处理器一样,支持64-bit指令集的处理器已经很普遍了,如AMD公司的AMD-64.Intel公司的EM64T及IA-64.处理器属于硬件

64位和32位的寄存器和汇编的比较

转载于http://blog.csdn.net/qq_29343201/article/details/51278798 64位(新增)汇编指令的不同 mov指令和push pop扩展了movq系列的mov和pushq以及popq用来操作quad word. 注意:movabsq不是32位的扩展,是纯新增的指令.用来将一个64位的字面值直接存到一个64位寄存器中.因为movq只能将32位的值存入,所以新增了这样一条指令. 顺带提一个小问题,64位的汇编代码在ret之前可能会加一句rep,这里的r

【C语言】32位,64位机器sizeof区别

float, double : 采用IEEE标准浮点数格式,格式固定 float 32bit, double 64bit int一般和CPU寄存器长度有关,不过也和编译器,汇编器有关 由于C ,C++ 标准没有规定整数类型的固定长度.同一CPU不同操作系统和编译器,对于int 类型规定的长度是不同的于是为了区别这些不同,出现了数据模型这种东西.数据模型(LP32 ILP32 LP64 LLP64 ILP64 )TYPE               LP32  ILP32  LP64  ILP64

Photoshop CS6最新官方正式中文破解版(32位、64位)

Photoshop是强大的图形处理软件,在前端开发领域中,主要用于页面的图形设计与网站UI切图. 目前最新版为Adobe Photoshop CS6 在CS6中整合了其Adobe专有的 Mercury图像引擎,通过显卡核心GPU提供了强悍的图片编辑能力. 但是相对于CS5来说,操作上发生了一定程度的变化,所以建议使用时仔细查看说明文档. 此次提供的版本为官方正式中文版,非汉化版.精简版.绿色版.包含Photoshop CS6中的所有组件与素材. 安装时请断开网络,并选择安装试用版.待软件全部安装