NEC V850E 串口不会用
我用applilet自动生成了串口函数#include "CG_macrodriver.h"
#include "CG_serial.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "CG_userdefine.h"
/*
*******************************************************************************
**Global define
*******************************************************************************
*/
UCHAR*gpUarta1TxAddress; /* uarta1 transmit buffer address */
USHORT gUarta1TxCnt; /* uarta1 transmit data number */
UCHAR*gpUarta1RxAddress; /* uarta1 receive buffer address */
USHORT gUarta1RxCnt; /* uarta1 receive data number */
USHORT gUarta1RxLen; /* uarta1 receive data length */
/* Start user code for global. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
/*
**-----------------------------------------------------------------------------
**
**Abstract:
** This function initializes the UARTA1 module.
**
**Parameters:
** None
**
**Returns:
** None
**
**-----------------------------------------------------------------------------
*/
void UARTA1_Init(void)
{
UA1TXE = 0U; /* disable UARTA1 transmission operation */
UA1RXE = 0U; /* disable UARTA1 reception operation */
UA1PWR = 0U; /* disable UARTA1 operation */
UA1TMK = 1U; /* disable INTUA1T interrupt */
UA1TIF = 0U; /* clear INTUA1T interrupt flag */
UA1RMK = 1U; /* disable INTUA1R interrupt */
UA1RIF = 0U; /* clear INTUA1R interrupt flag */
/* Set INTUA1T level low priority */
UA1TIC |= 0x07U;
/* Set INTUA1R level low priority */
UA1RIC |= 0x07U;
UA1CTL1 = 0x03;
UA1CTL2 = _0D_UARTA1_BASECLK_DIVISION;
UA1CTL0 = _10_UARTA_TRANSFDIR_LSB | _00_UARTA_PARITY_NONE | _02_UARTA_DATALENGTH_8BIT | _00_UARTA_STOPLENGTH_1BIT;
UA1OPT0 = _14_UARTA_UAnOPT0_INITIALVALUE | _00_UARTA_TRAN_DATALEVEL_NORMAL | _00_UARTA_REC_DATALEVEL_NORMAL;
UA1PWR = 1U; /* enable UARTA1 operation */
/* Set alternate-function pin to UARTA I/O pin. */
/* Set TXDA1 output and RXDA1 input. */
PFC3_bit.no0 = 0;
PFCE3_bit.no0 = 0;
PMC3_bit.no0 = 1;
PFC3_bit.no1 = 0;
PFCE3_bit.no1 = 0;
PMC3_bit.no1 = 1;
}
/*
**-----------------------------------------------------------------------------
**
**Abstract:
** This function starts the UARTA1 operation.
**
**Parameters:
** None
**
**Returns:
** None
**
**-----------------------------------------------------------------------------
*/
void UARTA1_Start(void)
{
UA1TIF = 0U; /* clear INTUA1T interrupt flag */
UA1TMK = 0U; /* enable INTUA1T interrupt */
UA1RIF = 0U; /* clear INTUA1R interrupt flag */
UA1RMK = 0U; /* enable INTUA1R interrupt */
UA1TXE = 1U; /* enable UARTA1 transmission operation */
UA1RXE = 1U; /* enable UARTA1 reception operation */
}
/*
**-----------------------------------------------------------------------------
**
**Abstract:
** This function stops the UARTA1 operation.
**
**Parameters:
** None
**
**Returns:
** None
**
**-----------------------------------------------------------------------------
*/
void UARTA1_Stop(void)
{
UA1TXE = 0U; /* disable UARTA1 transmission operation */
UA1RXE = 0U; /* disable UARTA1 reception operation */
UA1TMK = 1U; /* disable INTUA1T interrupt */
UA1TIF = 0U; /* clear INTUA1T interrupt flag */
UA1RMK = 1U; /* disable INTUA1R interrupt */
UA1RIF = 0U; /* clear INTUA1R interrupt flag */
}
/*
**-----------------------------------------------------------------------------
**
**Abstract:
** This function receives UARTA1 data.
**
**Parameters:
** rxbuf: receive buffer pointer
** rxnum: buffer size
**
**Returns:
** MD_OK
** MD_ARGERROR
**
**-----------------------------------------------------------------------------
*/
MD_STATUS UARTA1_ReceiveData(UCHAR *rxbuf, USHORT rxnum)
{
MD_STATUS status = MD_OK;
if (rxnum < 1U)
{
status = MD_ARGERROR;
}
else
{
gUarta1RxCnt = 0U;
gUarta1RxLen = rxnum;
gpUarta1RxAddress = rxbuf;
status = MD_OK;
}
return (status);
}
/*
**-----------------------------------------------------------------------------
**
**Abstract:
** This function sends UARTA1 data.
**
**Parameters:
** txbuf: transfer buffer pointer
** txnum: buffer size
**
**Returns:
** MD_OK
** MD_ARGERROR
** MD_DATAEXISTS
**
**-----------------------------------------------------------------------------
*/
MD_STATUS UARTA1_SendData(UCHAR *txbuf, USHORT txnum)
{
MD_STATUS status = MD_OK;
if (txnum < 1U)
{
status = MD_ARGERROR;
}
else
{
gpUarta1TxAddress = txbuf;
gUarta1TxCnt = txnum;
if((UA1STR & 0x80U) == 0U)
{
UA1TMK = 1U; /* disable INTUA1T interrupt */
UA1TX = *gpUarta1TxAddress;
gpUarta1TxAddress++;
gUarta1TxCnt--;
UA1TMK = 0U; /* enable INTUA1T interrupt */
status = MD_OK;
}
else
{
status = MD_DATAEXISTS;
}
}
return (status);
}
/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
然后我在main函数中如下调用
UARTA1_Start();
UARTA1_SendData("hello ",6);
UARTA1_Stop();
但是串口无输出,请问大侠们,NEC串口到底怎么用啊?谢谢 debug是单步没问题,但是go以后就不行了 MCU工作在64MHz
波特率是9600
貌似是MCU工作频率太高的缘故,所以在适当的位置加入延时就OK了。
MD_STATUS UARTA1_SendData(UCHAR *txbuf, USHORT txnum)
{
MD_STATUS status = MD_OK;
if (txnum < 1U)
{
status = MD_ARGERROR;
}
else
{
gpUarta1TxAddress = txbuf;
gUarta1TxCnt = txnum;
if((UA1STR & 0x80U) == 0U)
{
UA1TMK = 1U; /* disable INTUA1T interrupt */
UA1TX = *gpUarta1TxAddress;
gpUarta1TxAddress++;
gUarta1TxCnt--;
UA1TMK = 0U; /* enable INTUA1T interrupt */
//add delay 100us
status = MD_OK;
}
else
{
status = MD_DATAEXISTS;
}
}
不知道还有没有更好的办法。 经测试:
CPU频率降低到最低的1MHz
波特率提高到256000
可以直接用applilet3生成的串口函数,正确发送data,无需再添加延时函数。 LZ用的是哪块MCU? V850E/IG3 (70F3454) 使用applilet生成的函数UARTA1_SendData("h", 1);发送一个字节已经OK(CPU频率任意,波特率任意),发送多个字节方法还没找到。
示例如下:
while(1)
{
while(UA1STR_bit.no7 == 1U); //发送前,先判断前一个data是否发送成功,不成功则循环
UARTA1_SendData("h", 1);
while(UA1STR_bit.no7 == 1U);
UARTA1_SendData("e", 1);
while(UA1STR_bit.no7 == 1U);
UARTA1_SendData("l", 1);
while(UA1STR_bit.no7 == 1U);
UARTA1_SendData("l", 1);
while(UA1STR_bit.no7 == 1U);
UARTA1_SendData("o", 1);
while(UA1STR_bit.no7 == 1U);
UARTA1_SendData(" ", 1);
} NEC V850串口发送最简单的实现方法(非中断,使用IAR编译器)
void put_char(unsigned char c)
{
while(UA1TSF == 1U)
;
UA1TX = c;
} V850E/Ix3好象没有配套的Applilet嘛,不过网上有应用手册和例程
点击此处下载 ourdev_564378J1I3JP.pdf(文件大小:190K) (原文件名:UARTA-U18723EJ1V0AN00.pdf)
点击此处下载 ourdev_564379LQAFTP.zip(文件大小:5K) (原文件名:UARTA-U18723EJ1V0AN00_SRC.zip) 回复【8楼】sophie0403
v850e/ix3好象没有配套的applilet嘛,不过网上有应用手册和例程
点击此处下载(原文件名:uarta-u18723ej1v0an00.pdf)
点击此处下载(原文件名:uarta-u18723ej1v0an00_src.zip)
-----------------------------------------------------------------------
是的,我用的是applilet3 for V850ESJX3结合V850E应用手册来修改的
NEC出这么一个applilet 工具非常好,但问题是applilet不支持NEC所有的MCU,这个应该任务量也不大吧
还有一个问题就是,NEC不同系列的MCU对应不一样的applilet,这样对NEC不熟悉的人来说找起来很不方便,整合在一起不是更好吗?维护也方便,客户使用也简单方便。
真不知道NEC是怎么想的,哎。。。
页:
[1]