2023-01-11 10:33:01 -05:00
|
|
|
|
|
|
|
|
|
/* Debug */
|
|
|
|
|
/* Provide printf subroutine and delay function */
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
|
|
#ifndef UART0_BAUD
|
|
|
|
|
#define UART0_BAUD 9600
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef UART1_BAUD
|
|
|
|
|
#define UART1_BAUD 9600
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void CfgFsys( ); // CH554 clock selection and configuration
|
|
|
|
|
|
|
|
|
|
void mDelayuS (uint16_t n); // Delay in units of uS
|
|
|
|
|
void mDelaymS (uint16_t n); // Delay in mS
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : CH554UART0Alter()
|
|
|
|
|
* Description : CH554 serial port 0 pin mapping, serial port mapping to P0.2 and P0.3
|
|
|
|
|
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline void CH554UART0Alter()
|
|
|
|
|
{
|
|
|
|
|
PIN_FUNC |= bUART0_PIN_X; //串口映射到P1.2和P1.3
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : mInitSTDIO()
|
|
|
|
|
* Description : CH554 serial port 0 is initialized, T1 is used as the baud rate generator of UART0 by default, T2 can also be used
|
|
|
|
|
As a baud rate generator
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline void mInitSTDIO( )
|
|
|
|
|
{
|
|
|
|
|
uint32_t x;
|
|
|
|
|
uint8_t x2;
|
|
|
|
|
|
|
|
|
|
SM0 = 0;
|
|
|
|
|
SM1 = 1;
|
|
|
|
|
SM2 = 0; //Serial port 0 usage mode 1
|
|
|
|
|
//Use Timer1 as a baud rate generator
|
|
|
|
|
RCLK = 0; //UART0 receive clock
|
|
|
|
|
TCLK = 0; //UART0 transmit clock
|
|
|
|
|
PCON |= SMOD;
|
|
|
|
|
x = 10 * FREQ_SYS / UART0_BAUD / 16; //If you change the main frequency, be careful not to overflow the value of x
|
|
|
|
|
x2 = x % 10;
|
|
|
|
|
x /= 10;
|
|
|
|
|
if ( x2 >= 5 ) x ++; //rounding
|
|
|
|
|
|
|
|
|
|
TMOD = TMOD & ~ bT1_GATE & ~ bT1_CT & ~ MASK_T1_MOD | bT1_M1; //0X20, Timer1 as 8-bit auto-reload timer
|
|
|
|
|
T2MOD = T2MOD | bTMR_CLK | bT1_CLK; //Timer1 clock selection
|
|
|
|
|
TH1 = 0-x; //12MHz crystal oscillator, buad / 12 is the actual need to set the baud rate
|
|
|
|
|
TR1 = 1; //Start timer 1
|
|
|
|
|
TI = 1;
|
|
|
|
|
REN = 1; //Serial 0 receive enable
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : CH554UART0RcvByte()
|
|
|
|
|
* Description : CH554UART0 receives a byte
|
|
|
|
|
* Return : SBUF
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline uint8_t CH554UART0RcvByte( )
|
|
|
|
|
{
|
|
|
|
|
while(RI == 0); // wait for uart rx interrupt flag
|
|
|
|
|
RI = 0;
|
|
|
|
|
return SBUF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : CH554UART0SendByte(uint8_t SendDat)
|
|
|
|
|
* Description : CH554UART0 sends a byte
|
|
|
|
|
* Input : uint8_t SendDat; the data to be sent
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline void CH554UART0SendByte(uint8_t SendDat)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
SBUF = SendDat;
|
|
|
|
|
while(TI ==0); // wait for transmit to finish (TI == 1)
|
|
|
|
|
TI = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : CH554UART1Alter()
|
|
|
|
|
* Description : Set the alternate pin mappings for UART1 (TX on P3.2, RX on P3.4)
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline void CH554UART1Alter()
|
|
|
|
|
{
|
|
|
|
|
PIN_FUNC |= bUART1_PIN_X;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : UART1Setup()
|
|
|
|
|
* Description : CH554串口1初始化
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline void UART1Setup()
|
|
|
|
|
{
|
|
|
|
|
U1SM0 = 0; //UART1选择8位数据位
|
|
|
|
|
U1SMOD = 1; //快速模式
|
|
|
|
|
U1REN = 1; //使能接收
|
2023-11-14 03:33:02 -05:00
|
|
|
|
// should correct for rounding in SBAUD1 calculation
|
2023-01-11 10:33:01 -05:00
|
|
|
|
SBAUD1 = 256 - FREQ_SYS/16/UART1_BAUD;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : CH554UART1RcvByte()
|
|
|
|
|
* Description : CH554UART1接收一个字节
|
|
|
|
|
* Return : SBUF
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline uint8_t CH554UART1RcvByte( )
|
|
|
|
|
{
|
|
|
|
|
while(U1RI == 0); //查询接收,中断方式可不用
|
|
|
|
|
U1RI = 0;
|
|
|
|
|
return SBUF1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : CH554UART1SendByte(uint8_t SendDat)
|
|
|
|
|
* Description : CH554UART1发送一个字节
|
|
|
|
|
* Input : uint8_t SendDat;要发送的数据
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline void CH554UART1SendByte(uint8_t SendDat)
|
|
|
|
|
{
|
|
|
|
|
SBUF1 = SendDat; //查询发送,中断方式可不用下面2条语句,但发送前需TI=0
|
|
|
|
|
while(U1TI ==0);
|
|
|
|
|
U1TI = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if SDCC < 370
|
|
|
|
|
void putchar(char c);
|
|
|
|
|
char getchar();
|
|
|
|
|
#else
|
|
|
|
|
int putchar(int c);
|
|
|
|
|
int getchar(void);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : CH554WDTModeSelect(uint8_t mode)
|
|
|
|
|
* Description : CH554 watchdog mode selection
|
|
|
|
|
* Input : uint8_t mode
|
|
|
|
|
0 timer
|
|
|
|
|
1 watchDog
|
|
|
|
|
* Output : None
|
|
|
|
|
* Return : None
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline void CH554WDTModeSelect(uint8_t mode)
|
|
|
|
|
{
|
|
|
|
|
SAFE_MOD = 0x55;
|
|
|
|
|
SAFE_MOD = 0xaa; //Enter Safe Mode
|
|
|
|
|
if(mode){
|
|
|
|
|
GLOBAL_CFG |= bWDOG_EN; //Start watchdog reset
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else GLOBAL_CFG &= ~bWDOG_EN; //Start watchdog only as a timer
|
|
|
|
|
SAFE_MOD = 0x00; //exit safe Mode
|
|
|
|
|
WDOG_COUNT = 0; //Watchdog assignment initial value
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Function Name : CH554WDTFeed(uint8_t tim)
|
|
|
|
|
* Description : CH554 watchdog timer time setting
|
|
|
|
|
* Input : uint8_t tim watchdog reset time setting
|
|
|
|
|
|
|
|
|
|
00H(6MHz)=2.8s
|
|
|
|
|
80H(6MHz)=1.4s
|
|
|
|
|
* Output : None
|
|
|
|
|
* Return : None
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
inline void CH554WDTFeed(uint8_t tim)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
WDOG_COUNT = tim; // Watchdog counter assignment
|
|
|
|
|
|
|
|
|
|
}
|
2023-11-06 06:19:00 -05:00
|
|
|
|
|
|
|
|
|
// Set pin p1.4 and p1.5 to GPIO output mode.
|
|
|
|
|
void gpio_init();
|
|
|
|
|
void gpio_set(uint8_t pin);
|
2023-11-14 03:33:02 -05:00
|
|
|
|
void gpio_unset(uint8_t pin);
|