编程环境为Keil,使用的单片机为FM33G048(m0+)
工程需要如下配置,不要勾选MicroLIB
建立好工程后,将全部的库函数改成xxx.cpp(其实不改应该也没事,库函数调用的xxx.h里已添加下列关键字)
#ifdef __cplusplus
extern "C" {
#endif
/*代码部分*/
#ifdef __cplusplus
}
#endif
然后将全部中断拿出来建立 it.cpp和it.h,并在it.h中按照上面的代码方式声明一下
#ifndef __FM33G0XX_IT_H
#define __FM33G0XX_IT_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "FM33G0XX.h"
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void NMI_Handler(void);
void HardFault_Handler(void);
void SVC_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void WWDT_IRQHandler(void);
void SVD_IRQHandler(void);
void RTC_IRQHandler(void);
void NVMIF_IRQHandler(void);
void FDET_IRQHandler(void);
void ADC_IRQHandler(void);
void HSPI_IRQHandler(void);
void SPI1_IRQHandler(void);
void SPI2_IRQHandler(void);
void UART0_IRQHandler(void);
void UART1_IRQHandler(void);
void UART2_IRQHandler(void);
void UART3_IRQHandler(void);
void UART4_IRQHandler(void);
void UART5_IRQHandler(void);
void U78160_IRQHandler(void);
void U78161_IRQHandler(void);
void I2C_IRQHandler(void);
void LCD_IRQHandler(void);
void AES_IRQHandler(void);
void LPTIM_IRQHandler(void);
void DMA_IRQHandler(void);
void WKUP_IRQHandler(void);
void COMP_IRQHandler(void);
void BTIM1_IRQHandler(void);
void BTIM2_IRQHandler(void);
void ETIM1_IRQHandler(void);
void ETIM2_IRQHandler(void);
void ETIM3_IRQHandler(void);
void ETIM4_IRQHandler(void);
void GPIO_IRQHandler(void);
void LPUART_IRQHandler(void);
#ifdef __cplusplus
}
#endif
#endif
因为中断都是由C实现的,所以全部中断都要这样做。在it.cpp中可以什么也不写,或者把中断入口函数写出来,用哪个就在里面写个中断回调就可以。
由于单片机空间有限,并且很多涉及到硬件底层需要重定义的问题,因此不要使用 iostream 。
关于如何使用printf,参考如下代码,配置完串口之后就可以正常使用printf了
#include <stdio.h>
#include <SYS.h>
#define Use_Uartx_Send 1
#pragma import(__use_no_semihosting) // 禁用半主机模式
// 请不要勾选Use MicroLib
#ifdef __MICROLIB
#error "Please do not use MicroLib!"
#endif
extern "C"
{
void _sys_exit(int returncode)
{
printf("Exited! returncode=%d\n", returncode);
while (1);
}
void _ttywrch(int ch)
{
#if Use_Uartx_Send==0
while((UART0->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART0->TXREG = (uint8_t) ch;
#endif
#if Use_Uartx_Send==1
while((UART1->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART1->TXREG = (uint8_t) ch;
#endif
#if Use_Uartx_Send==2
while((UART2->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART2->TXREG = (uint8_t) ch;
#endif
#if Use_Uartx_Send==3
while((UART3->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART3->TXREG = (uint8_t) ch;
#endif
#if Use_Uartx_Send==4
while((UART4->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART4->TXREG = (uint8_t) ch;
#endif
#if Use_Uartx_Send==5
while((UART5->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART5->TXREG = (uint8_t) ch;
#endif
}
}
namespace std
{
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
FILE __stdin = {0};
FILE __stdout = {1};
FILE __stderr = {2};
int fgetc(FILE *stream)
{
int c = 0;
if (stream->handle == 0)
{
#if Use_Uartx_Send==0
while((UART0->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART0->TXREG = (uint8_t) c;
#endif
#if Use_Uartx_Send==1
while((UART1->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART1->TXREG = (uint8_t) c;
#endif
#if Use_Uartx_Send==2
while((UART2->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART2->TXREG = (uint8_t) c;
#endif
#if Use_Uartx_Send==3
while((UART3->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART3->TXREG = (uint8_t) c;
#endif
#if Use_Uartx_Send==4
while((UART4->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART4->TXREG = (uint8_t) c;
#endif
#if Use_Uartx_Send==5
while((UART5->TXBUFSTA & 0X00000001)==1){;}//自行修改串口打印的Uart口
UART5->TXREG = (uint8_t) c;
#endif
_ttywrch((c == '\r') ? '\n' : c); // 回显
return c;
}
return EOF;
}
int fputc(int c, FILE *stream)
{
if (stream->handle == 1 || stream->handle == 2)
{
_ttywrch(c);
return c;
}
return EOF;
}
int fclose(FILE * stream)
{
return 0;
}
int fseek(FILE *stream, long int offset, int whence)
{
return -1;
}
int fflush(FILE *stream)
{
if (stream->handle == 1 || stream->handle == 2)
#if Use_Uartx_Send==0
while (UART_UARTIF_RxTxIF_ChkEx(UART0, RxInt) == SET);
#endif
#if Use_Uartx_Send==1
while (UART_UARTIF_RxTxIF_ChkEx(UART1, RxInt) == SET);
#endif
#if Use_Uartx_Send==2
while (UART_UARTIF_RxTxIF_ChkEx(UART2, RxInt) == SET);
#endif
#if Use_Uartx_Send==3
while (UART_UARTIF_RxTxIF_ChkEx(UART3, RxInt) == SET);
#endif
#if Use_Uartx_Send==4
while (UART_UARTIF_RxTxIF_ChkEx(UART4, RxInt) == SET);
#endif
#if Use_Uartx_Send==5
while (UART_UARTIF_RxTxIF_ChkEx(UART5, RxInt) == SET);
#endif
return 0;
}
}